這篇文章主要介紹Unity3D如何實(shí)現(xiàn)動(dòng)態(tài)分辨率降低渲染開銷,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
貴陽網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,貴陽網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為貴陽上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的貴陽做網(wǎng)站的公司定做!
之前項(xiàng)目降低分辨率我們都普遍使用Screen.SetResolution,但是它有兩個(gè)問題。
1.每次設(shè)置的時(shí)候屏幕會(huì)閃爍。
2.降低分辨率與攝像機(jī)無關(guān),無法做到只降低3D攝像機(jī)的分辨率,保留UI攝像機(jī)不降低分辨率。
其實(shí)我們可以使用攝像機(jī)動(dòng)態(tài)分辨率,如下圖所示,給需要降低分辨率的攝像機(jī)打開allow Dynamic Resolution屬性。
如下圖所示,在ProjectSetting上必須勾選Enable Frame Timing Stats屬性。
代碼中就可以很方便設(shè)置分辨率了。
ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale);
如下圖所示在iPhone X上,頻繁設(shè)置3D攝像機(jī)分辨率并不會(huì)出現(xiàn)閃爍的情況,而且并沒有影響UI攝像機(jī)看到的文本(Text)的分辨率
需要注意的是動(dòng)態(tài)分辨率安卓Android(僅適用于Vulkan) 或者也可以用SRP可編程渲染管線,最后在修改RT這樣就都支持了。
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; public class DynamicResolutionTest : MonoBehaviour{ public Text screenText; FrameTiming[] frameTimings = new FrameTiming[3]; public float maxResolutionWidthScale = 1.0f; public float maxResolutionHeightScale = 1.0f; public float minResolutionWidthScale = 0.5f; public float minResolutionHeightScale = 0.5f; public float scaleWidthIncrement = 0.1f; public float scaleHeightIncrement = 0.1f; float m_widthScale = 1.0f; float m_heightScale = 1.0f; // Variables for dynamic resolution algorithm that persist across frames uint m_frameCount = 0; const uint kNumFrameTimings = 2; double m_gpuFrameTime; double m_cpuFrameTime; // Use this for initialization void Start() { int rezWidth = (int)Mathf.Ceil(ScalableBufferManager.widthScaleFactor * Screen.currentResolution.width); int rezHeight = (int)Mathf.Ceil(ScalableBufferManager.heightScaleFactor * Screen.currentResolution.height); screenText.text = string.Format("Scale: {0:F3}x{1:F3}\nResolution: {2}x{3}\n", m_widthScale, m_heightScale, rezWidth, rezHeight); } private void OnGUI() { float oldWidthScale = m_widthScale; float oldHeightScale = m_heightScale; // One finger lowers the resolution if (GUILayout.Button("-- ")) { m_heightScale = Mathf.Max(minResolutionHeightScale, m_heightScale - scaleHeightIncrement); m_widthScale = Mathf.Max(minResolutionWidthScale, m_widthScale - scaleWidthIncrement); } // Two fingers raises the resolution if (GUILayout.Button("++ ")) { m_heightScale = Mathf.Min(maxResolutionHeightScale, m_heightScale + scaleHeightIncrement); m_widthScale = Mathf.Min(maxResolutionWidthScale, m_widthScale + scaleWidthIncrement); } if (m_widthScale != oldWidthScale || m_heightScale != oldHeightScale) { ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale); } } // Update is called once per frame void Update() { DetermineResolution(); int rezWidth = (int)Mathf.Ceil(ScalableBufferManager.widthScaleFactor * Screen.currentResolution.width); int rezHeight = (int)Mathf.Ceil(ScalableBufferManager.heightScaleFactor * Screen.currentResolution.height); screenText.text = string.Format("Scale: {0:F3}x{1:F3}\n動(dòng)態(tài)分辨率: {2}x{3}\nScaleFactor: {4:F3}x{5:F3}\nGPU: {6:F3} CPU: {7:F3}", m_widthScale, m_heightScale, rezWidth, rezHeight, ScalableBufferManager.widthScaleFactor, ScalableBufferManager.heightScaleFactor, m_gpuFrameTime, m_cpuFrameTime); } // Estimate the next frame time and update the resolution scale if necessary. private void DetermineResolution() { ++m_frameCount; if (m_frameCount <= kNumFrameTimings) { return; } FrameTimingManager.CaptureFrameTimings(); FrameTimingManager.GetLatestTimings(kNumFrameTimings, frameTimings); if (frameTimings.Length < kNumFrameTimings) { Debug.LogFormat("Skipping frame {0}, didn't get enough frame timings.", m_frameCount); return; } m_gpuFrameTime = (double)frameTimings[0].gpuFrameTime; m_cpuFrameTime = (double)frameTimings[0].cpuFrameTime; }}
以上是“Unity3D如何實(shí)現(xiàn)動(dòng)態(tài)分辨率降低渲染開銷”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!