这一章会阐述一些达到最好性能的技巧,将帮助大家在GeForce系列显卡上完成性能的优化工作。为了您的方便,这些技巧通过管道组织。每一节,我们会按照重要性等级给出大致的建议,这样大家可以把精力集中到重要的地方去。
你可以在这里可以对现代GPU的管线有个整体的了解:Graphics Pipeline Performance chapter of the book GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics。这张所覆盖的对于瓶颈的定位,其实是想说明如何寻找潜在的性能问题在所有的管线阶段中。
图形管线性能技巧免费使用:http://developer.nvidia.com/object/gpu_gems_samples.html。
3.1 List of Tips
如果使用正确,GPU能够完成极其高等级的性能工作。下面的列表提供了一些可行的性能技巧,这些概述接下来的章节解释的更多细节。
(1)使用更少的批次
☆使用texture atlases/texture arrays去避免State改变: http://developer.nvidia.com/object/nv_texture_tools.html。
☆在DirectX,使用实例化的API去避免类似SetMatrix这样的相同的实例化的状态改变。
☆减少状态改变。
(1)使用indexed primitive calls
☆使用 DirectX ID3DXMesh/ID3DX10Mesh optimization calls [OptimizeInplace() 或者 Optimize()] 。
☆使用NVTriStrip utility如果Indexed List不能正常使用:
http://developer.nvidia.com/object/nvtristrip_library.html
(2)顶点设置属性的瓶颈。
☆Large vertices/many vertices 经常会导致属性瓶颈。
☆在Vetex Shader中重复计算数据。
☆减少顶点的大小。
☆只有在确实需要的时候才使用动态的Vertex buffers。
(1)最高等级的Shader model的选择。
(2)一直使用最新版本的FXC
(3)使用最低精度的数据,比如:
☆做任何事情,更喜欢使用Half去代替float。
(4)Pixed shader瓶颈。
☆当你在Pixed shader里面受到约束的时候,在Vertex shader里面使用线性的计算。
☆充分发挥Early Z Culling优化的优势。
(5)插值式的属性瓶颈。
☆把Vertex的计算放到Pixel shader中去。
☆避免Contants当做插值传递。在Shader stage需要的时候使用相同的常量。
(6)Geometry Shaders:
☆确信你真的需要他,或者说你再也没有更好的选择,就像Instancing。
☆使用尽可能小的maxvertexcount value。
☆使用最小的vertice。
(1)逐像素光照。
(2)使用FX Composer程序化生成纹理的方式。
(3)sincos, log, exp是原生态指令,不需要使用纹理查找来替代。
(1)一直使用Mipmapping。
(2)谨慎使用 trilinear and anisotropic filtering。
☆匹配各种等级的anisotropic filtering过于复杂。
☆使用Photoshop 插件去确认anisotropic filtering 等级,参考:
http://developer.nvidia.com/object/nv_texture_tools.htm
☆遵循简单的法则:如果纹理是噪化的,打开anisotropic filtering。
(1)Double-speed z-only and stencil rendering。
(2)Early-z(Z-CUll)优化。
(1)确保如果需要的时候才打开。