尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Unity性能优化_UI

Unity性能优化_UI 与3D场景渲染机制不一样UI渲染以Canvas为单位进行CPU负责把UI界面的逻辑结构进行更新汇总并负责把这些数据准备好最后把这些信息传给GPU。渲染开销指标建议控制在2ms以内对于一个3D游戏来说一般UI Drawcall控制在50对于比较重UI的游戏也尽量不要超过100。影响因素影响CPU的因素界面结构复杂度界面结构变化频率动画复杂度影响GPU的因素Drawcall图片最终在屏幕所展现的面积图片是否透明Shader的复杂度Overrdraw单位像素的重新绘制次数其中特别值得注意的是Drawcall和Overdraw。单个界面复杂度上限是多少具体一个界面应该限制在多少层级官方并没有一个标准的推荐值这不是单一维度可以衡量的因为每个界面的材质纹理复杂度Canvas Render的裁剪合并结果都不一样所以最终需要项目组做具体的测试。如果单个UI比较复杂还可能因为引用的资源量较多导致IO时间过长。Unity Profiler指标分析Canvas.Sorting() 耗时过高减少Canvas使用数量减少动态排序逻辑。Canvas.SendWillRenderCanvases() 耗时过高UI全部都在一个canvas下层级很深并且里面有很多的UI效果导致UI更新耗时较长建议对UI动态和静态进行拆分多个canvas但不能太多否则Canvas.Sort()会阻塞主线程减少UI的层级。优化方式 Part1一 批处理UI批处理对UI的批处理比较复杂它受UI布局的影响是否透明是否遮挡是否深度相邻是否Desc一致 即相同状态参考UI合批规则完整性测试Unity中关于UGUI中因为UI遮挡关系不同而造成DrawCall变化的猜想Unity UI优化指导优化移动游戏性能来自Unity顶级工程师的Physics、UI和音频设置小贴士 | Unity Blog二 动静分离优化UGUI.UpdateBatches时间特别由于低端机的核数较少导致UpdateBatches的Job很难得到调度将会动的UI元素单独放到⼀个Canvas⾥这样每帧UpdateBatches的 开销会减少三 半透Sprite处理-关于填充率UGUI只产生quad简单的顶点所以顶点着色器不太可能给GPU Tiler流水线产生压力。着色器中的任何问题都应归结于填充率 Fillrate在移动设备上FillRate 的压力主要来自半透明物体注意绘制像 alpha0 这种实际上不会产生效果的颜色上去也同样有 Blend 操作这是一种极大的浪费UI渲染过程中 谨慎 全屏透明的渲染隐藏不可见的对象四 Alpha Test渲染设置避免使用Alpha Test因为非常耗时性价比很低。五 Shader留意到里面有discard语句可能带来性能影响应编写无clip版本的Shader。六 RenderTarget2D项目所有相机都没有⽤到RT的Depth可以在创建RT的时候不创建Depth和Stencil降低内存和显存带宽消耗。七 SetActive根据UI界面使用频率的不同区别处理使用频率很低直接Instantiate/Destroy处理使用较为频繁可缓存并通过SetActive管理可见性如果使用频率非常高比如BattleHud界面则可通过改变UI界面Alpha 1/0同时开关blocksRaycasts值的方式来处理PSWhy SetActive 导致卡顿会导致网格重建会导致内存分配触发GC会遍历这个实体上所有继承MonoBehaviour的脚本的OnEnable和OnDisanle调用对于复杂结构的物体父物体在使用SetActive时 也会调用子物体的GameObject.Activate和GameObject.Deactivate有初始化逻辑的可能重新做一些初始化的工作八 全屏UI策略UI覆盖全屏的情况下可以不渲染后面的3D场景可能导致发热降频、耗电量高避免Overdraw⻓时间不动的界⾯可以实现OndemandedRendering动态降频九 OnGui()GUI.Repaint() 说明有使用原生的IMGUIOnGUI建议不要在正式上线版本中使用。十 图集不需要的图集不进内存不要存放在Resources目录下打包成AssetBundle不使⽤的图集及时卸载提高图集的利⽤率如果⼤的图集中UI元素很少且存在⼤量的透明区域时需要进行合理的规划十一 九宫格对于一些规则的图比如背景框。十二 拼接超大尺寸的图片 考虑拼接方式十三 贴图格式压缩ASTC十四 Fonts合理规划字体数量并通过工具裁剪字体字库。十五 不使用Built-in资源UI引⽤了Unity⾃带的⼀部分Texture建议批量替换成项⽬组⾃⼰的优化方式 Part2 - 组件Mask组件规则遮罩时Mask组件建议换成RectMask2D更高效。LayoutGroup组件在UI没有增删的时候设置Enable false 否则会导致UI Layout时间大幅增加不需要进行事件接收的组件取消勾选Raycaster TargetText组件不使用富文本的Text取消勾选Rich Text不使用Best Fit用TextMashPro代替OutLineShadow组件UI-Particle含有大量的BakeMesh操作建议低端机去掉该功能。优化方式 Part3 - 资源加载策略资源加载使用异步接口。加载/初始化-分帧复杂界面拆分成多个子部分优先加载背景的部分。列表数据分页加载。优化方式 Part4 - Texture 2D Import Settings优化Sprite填充率尽量用双线性过滤不用三线性插值可读写没必要开启MipMapSprite类型的mipmapUI没必要因为固定分辨率大小UI图片很少有缩小的情况出现。PS纹理贴图载入内存时根据屏幕空间大小来计算多层mipmap。渲染系统会根据各个mip层的大小和几何图形在屏幕上的面积来决定哪一个mip层被选择。取消勾选Generate Physics Shape勾选该选项会生成物理碰撞的形状。Alpha Source针对于没有Alpha通道的图可以直接设置为None。(None无论输入纹理是否有 Alpha 通道导入的纹理都没有 Alpha 通道针对于Alpha通道不是0 就是 1的情况下选择Input Texture Alpha。注意同时选中Alpha is Transparency 选项Texture Type如果图像仅有⼀个通道则将Texture Type设置为 Single Channel。
返回列表