对于开发一款游戏,大多数的开发人员仅仅停留在会使用Unity提供的组件来做游戏开发,至于这些组件的底层是什么?渲染队列、深度写入以及Overdraw这些涉及到GPU的名词到底是什么?如何根据GPU性能指标来调优?这些基本上对于大多数开发人员都是陌生的。
对于有机会去手写Shader的开发人员,是否对Shader有足够的了解,在兼顾GPU性能的同时又可以实现完美的效果?
该课程从移动端GPU的架构入手,深入各种GPU性能指标来逐个分析哪些特性会拖垮GPU性能,小到数据类型,大到GPU硬件缓冲去全方位分析GPU性能的提升。
1. 移动端GPU架构简介
2. GPU性能指标
3. Shader代码优化
4. 以“水”特效实例从硬件层到软件层进行性能一步一步调优
作者于洋,Unity技术专家、引擎组组长。曾就职于人人网、Kabam、竞技世界。从事游戏开发十余年,经历了从Flash到Unity的游戏开发过程,长期从事游戏渲染和性能优化相关工作,对PBR、云、雾、地形、URP管线等有深入研究,曾参与过《Legacy of Zeus》、《荒岛求生》、《mythwar puzzle》等游戏的渲染和性能优化工作,乐于分享渲染和优化的相关技术。
目录
1|简介
2|移动端GPU架构简介
3|测试条件和小程序
4|采集GPU性能指标
5|结论分析
6|Shader代码优化
7|“水”特效优化
1|简介
现在市面上的手机游戏,不管是哪一种类型的,在场景设计上,不论是大世界、小城镇、森林、哪怕是沙漠中,或多或少都会出现“海”、“湖”等自然景观组成因素,以下我们统称为“水”特效,如下图,出自手游《原神》。
有的手游中甚至为了还原逼真效果,对“水”特效加上了一些计算较为复杂,严重拖慢GPU性能的效果,比如“折射”、“反射”、甚至海底“焦散”,这些效果如果真的按照场景中动态实时渲染的话,对于移动设备来说,压力会相当大。如果遇上了低端机,比如红米7A、早期的摩托罗拉、LG等几款机型,想要实时跑起来这些效果,更是难上加难。
本文将从移动端GPU架构、渲染队列、ZWrite、OverDraw等硬件方面和Shader代码复杂度方面,结合GPU性能分析工具对GPU性能从浅入深进行分析,最后拿“水”特效这个实例讲述如何在低端机设备上通过优化GPU,提高帧率。
对于GPU的优化,一般从带宽、OverDraw、Shader复杂度等方面来考虑,本文将涉及到OverDraw和shader复杂度方面,带宽优化后续文章会涉及到。
OverDraw是当同一个像素被进行多次绘制导致的一种现象。这种现象会产生比较严重的填充率问题。要理解OverDraw, 我们必须要知道Unity场景中渲染对象的渲染顺序。在不同渲染队列中的对象也是按照不同的顺序进行排列。比如,Unity在几何体队列(Geometry Queue)中,是按照从前到后(front-to-back)的顺序来对几何体进行绘制,这样可以最小化OverDraw,但是在透明队列(Transparent Queue)中,是按照从后到前(back-to-front)的顺序来实现屏幕上物体的透明效果。
OverDraw的优化是一个比较复杂的话题,没有一个万能的解决方案,但是我们可以通过减少那些无法自动排列的渲染对象的重叠(Overlapping)。从Unity的Scene视图着手研究,在我们编辑器下的Draw Mode里可以让我们看到当前场景中的OverDraw情况。