对于任何一个3D应用程序来说,追求场景画面真实感是一个无止尽的目标,其结果就是让我们的场景越来越复杂,模型更加精细,这必然给图形硬件带来极大的负荷以致于无法达到实时绘制帧率。因此,渲染优化是必不可少的。在渲染优化之前,我们需要对应用程序性能进行系统的评测,找出瓶颈,对症下药。对于3D应用程序来说,影响性能的十分多,同时不同的硬件配置条件下,瓶径也会有所不同。因此,对应用程序进行有效的性能评测,不仅需要对整个渲染管线原理有深入地了解,此外借助一些评测工具能让我们的工作事倍功半。
我们知道渲染流水线的速度是由最慢的阶段决定首先,因此对一个3D应用程序进行评测,首先要分析影响渲染性能的瓶颈是在CPU端还是GPU端,由此来绝对我们优化的对象。由于目前的图形加速硬件都具有强大的,这个瓶径往往出现在CPU端,我们可以通过一些工具获得这个信息,如Nvidia的NVPerfHUD。在评测选项中,我们可以查看CPU和GPU繁忙度这项,当CPU繁忙度是100%时,GPU还不是时,我们知道性能的瓶颈在CPU端,我们必须CPU端的操作,同时尽量的“喂饱”GPU,把一些费事的计算移值到GPU上,例如硬件骨骼蒙皮。当GPU端是瓶颈时,说明GPU超荷负载,有可能是因为有过多的渲染填充,也就是多边形数量太多(当前强大的GPU使得这种情况并不多见。
CPU上的瓶颈产生有两个方面,一是因为复杂AI计算或低效的代码,二是由于不好的渲染批处理或资源管理。对于第一种情况,我们可以利用VTurn这类的工具,把应用程序中所有函数调用时间从大到小的排列出来,我们就很容易知道问题所在。对第二种情况来说,同样利用NVPerfHUD,我们可以查看每帧的DP数目,看看批的数量是否过多(有一个具体的换算公式),查看纹理内存的数目,是否消耗了过多的显存。利用这些工具,我们基本上能够定位应用程序的瓶颈。在应用程序内部,编写一个内嵌的profiler功能,能更加便利的进行评测,此外利用Lua这样的脚本程序,让我们运行时调试,也能提高评测的效率。