Unity3D如何实现动态分辨率降低渲染开销
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普遍使用Screen.SetResolutio
千家信息网最后更新 2025年02月04日Unity3D如何实现动态分辨率降低渲染开销
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
之前项目降低分辨率我们都普遍使用Screen.SetResolution,但是它有两个问题。
1.每次设置的时候屏幕会闪烁。
2.降低分辨率与摄像机无关,无法做到只降低3D摄像机的分辨率,保留UI摄像机不降低分辨率。
其实我们可以使用摄像机动态分辨率,如下图所示,给需要降低分辨率的摄像机打开allow Dynamic Resolution属性。
如下图所示,在ProjectSetting上必须勾选Enable Frame Timing Stats属性。
代码中就可以很方便设置分辨率了。
ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale);
如下图所示在iPhone X上,频繁设置3D摄像机分辨率并不会出现闪烁的情况,而且并没有影响UI摄像机看到的文本(Text)的分辨率
需要注意的是动态分辨率安卓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动态分辨率: {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如何实现动态分辨率降低渲染开销"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
分辨率
摄像机
摄像
动态
开销
内容
属性
篇文章
频繁
两个
代码
价值
兴趣
可编
小伙
小伙伴
屏幕
情况
文本
时候
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
大型软件开发案例
数据库数据取整数
t3服务器管理器无法启动
海外服务器供应商
软件开发和软件app一样吗
共筑网络安全协同
软件开发人员笔记本
中华人民共和国网络安全法六十三
甘肃省网络安全工作大赛
电脑如何连接学校的服务器
多人生存服务器怎么训练
邮箱怎样设置服务器
数据库的技术核心
怎样一次性填入相同文字数据库
c语言可以软件开发吗
我的世界服务器怎么开挂
用服务器和本地有啥区别
兰州软件开发
电商管理软件开发公司
从网络安全法本身看网络安全是指
消逝2无法连接服务器
烟雨江湖如何开服务器
服务器装iis
地平线4选哪个服务器
网络安全与执法与侦查学哪个好
试题选项存数据库
升腾互联网科技有限公司
数据库的技术核心
龙华区正规网络技术开发分类
谈谈如何提高网络安全