现在GPU发展越来越快,一般的游戏都是从设计师开始,然后程序员把所有东西写进GPU。从最开始做设计到最终的GPU,每一部分都可能成为瓶颈,都有需优化的可能性,那么,开发者如何得知自身游戏的瓶颈究竟是什么?在5月18日的Qualcomm骁龙游戏和图形开发者研讨会上,Qualcomm创新工程中心高级工程总监 周庆就此分享了3D图形的优化建议。
当代3D游戏依赖于fragment的繁重工作量来达到逼真的效果,而渲染到比显示分辨率要低的像素平面则可以大幅降低fragment的处理时间,缩减大至9倍的工作量,开发者应考虑在可接受的图像质量和性能范围内尽量使用低分辨率,而对于反射、折射以及后处理等特效,可以考虑使用更低的分辨率。
当然,高性能的智能手机也可以使用较高的分辨率,但需设一个分辨率上限。锐利的2D HUD渲染和其他UI控制则可以采用较高分辨率渲染,然后和较低分辨率的帧进行合成。
周庆表示,每个draw call都会带来CPU上的工作量,每帧有50个draw call或许对性能没有太大影响, 但是500多个draw call则可能会大幅影响游戏性能。如果多个物体使用同样的shader和图形状态(比如纹理、blend状态等),那么这些物体应该放在同一批处理,这样可以减少draw call的数量。不同的纹理则可以放在一个纹理图集中,这样能够允许在一个draw call中集中处理更多的物体。
纹理压缩是减少带宽的重要工具,并能提高性能、降低能耗。开发者应检查并减少游戏中使用的纹理大小,并考虑控制最大的纹理尺寸,以保证超大纹理不会被包含到游戏中。对于最终只会占据屏幕几个像素的物体,不需要使用1024x1024大小的纹理。
除了查找纹理和其他一些功能性纹理之外,几乎所有的纹理都需要有mipmap贴图,mipmap贴图能够增加纹理缓存局部性,从而提高性能和渲染质量。
排序可能会减少状态变化以及overdraw,这两样都会对GPU性能产生负面影响,开发者可根据材质、不透明draw call从前到后来排序,最后画skybox。
Tessellation可以产生很好的渲染细节,而由于可以使用较低精度的建模,Tessellation往往可以大幅降低内存带宽需求和CPU使用率。但是,过分的Tessellation细分会产生小于像素的三角形,导致比较差的rasterizer利用率。这个问题可以利用距离、屏幕空间大小或其他适应性指标来决定tessellation factor解决。