“移动游戏GPU性能优化 - 由侑虎科技(上海)有限公司分享,日期:2018.11.11,主要探讨CPU端和GPU端的性能瓶颈,以及Unity中的DrawCall、RenderState、StaticBatching、GPUInstancing等概念。”
在移动游戏开发中,GPU性能优化是至关重要的,因为这直接影响到游戏运行的流畅度和电池寿命。本讲座重点讲解了CPU端和GPU端的性能瓶颈,并提出了相应的优化策略。
首先,CPU端性能瓶颈主要体现在DrawCall(绘制调用)和RenderState(渲染状态)上。DrawCall是CPU将渲染指令发送给GPU的过程,频繁的DrawCall会导致CPU和GPU之间的通信开销增大。Unity中的DrawCall包括SetPassCall和Batches,SetPass涉及到材质切换,应尽量减少MaterialInstance的出现,以降低DrawCall次数。此外,即使不参与渲染的粒子系统也应该在视域体外停止播放,以避免不必要的计算。Batches是指Unity合并多个物体的绘制操作,DrawCall和Batches并不总是相等,StaticBatching(静态批次合并)和DynamicBatching(动态批次合并)是Unity自动生成的优化手段,但需要注意移动设备上DrawCall数量应控制在[0,200]范围内。Unity5.5之后引入的GPUInstancing技术,利用OpenGLES3.0+,可以在GPU层面实现对象实例化,进一步减少DrawCall。
RenderState切换也是CPU端的性能杀手,应尽量减少RenderState的改变。例如,使用Material.SetPassFast来减少渲染状态的设置,避免过多的InstanceMaterial生成,利用MaterialPropertyBlock功能可以更高效地管理材质属性,减少性能损失。
GPU端的优化主要涉及纹理资源和渲染流水线。纹理数组(Texture2DArray)是一种有效的方法,它可以将多个相同尺寸、格式和标志的2D纹理集合在一起,看起来像一个单一的对象,从而减少了纹理切换的开销,提高GPU效率。
总结来说,移动游戏GPU性能优化的关键在于理解并控制CPU和GPU的工作流程,通过合理安排DrawCall、利用批次合并、减少RenderState切换、采用GPUInstancing以及优化纹理管理等方式,可以显著提升游戏的运行效率。开发者应持续关注Unity引擎的新特性,并结合具体平台的硬件限制进行针对性的优化。