天天看点

[gdc13]dx11效率优化

http://developer.amd.com/wordpress/media/2013/04/DX11PerformanceReloaded.ppsx

nv和amd共同呈现的一个dx11上面硬件优化方面的信息,非常棒的底层知识的介绍,不仅仅是dx11,dx9的开发者也会受益良多。

里面很多知识在其他地方也提到过,不过或是学习新的东西,或是复习已有的知识,开卷有益吧。

  • 运行时刻shader的asm会被编译成ISA机器汇编,才能被运行,这个过程会消耗一定cpu运算,造成卡顿,那么提前把需要的shader使用一下,来cache up是一个不错的选择。
  • 避免使用D3DXSHADER_IEEE_STRICTNESS编译选项,会影响优化
  • buffer需要根据用途来设置相应的flag来达到最有效率,详见这个文章吧:http://blog.csdn.net/ccanan/article/details/8854962
  • index/vertex buffer来修改顺序进而提升cache效率仍旧是建议的,早期nv一些工具后来在项目里使用发现没有提升,现在仍旧建议使用D3DXOptimizeFaces/D3DXOptimizeVertices来优化,或者自己做一些offline的工具也可以
  • dx11上面的constant buffer,有了更大的优化空间,根据update频率进行区分
  • 使用batch&cache尽量减少render state的转换和不必要的设置
  • 比较建议把vertex stream进行分离,depth pass用的pos+uv和lighting pass用的tangent/binormal分在不同stream里面,提高IA(Input assembly)效率
    • 2到3个stream是比较好的
  • vertex shader
    • indexed constant fetch&texture fetch是dependent fetches,这个会影响效率
    • 较少vertex shader output size, 对于a卡来说,4 float4一下的比较好
  • ps在dx11里面可以以scatter的方式来写入rt,不再是一个fragment只能写一个地方,这个对算法的影响蛮大的
  • 一些指令是比较费的:rcp, rsq, sin, cos, i2f, f2i, int 的乘除运算也是比较慢的,最好使用float
  • attribute的插值也是在ps里面计算的,所以尽量减少attribute的输入,对于a卡来说,pack到float4里面比较有意义
  • GPR(general purpose register),这个比较影响效率,我们可以把hlsl的汇编指令里面的register数量作为一个参考,这些部分会显著增加GPR数量
    • 临时变量的长生命周期
    • fetch dependencies(indexed constants比如)
    • 嵌套动态分支
    • 如果骨骼类的constant array比较大,不如换成texture来比较高效
  • DepthTest
    • nv的d24格式比较快,尽量用,amd是d16用于shadow最快
  • ROP阶段,文中的Export阶段(pixel shader到render target阶段)
    • [gdc13]dx11效率优化
    • 这里有一些格式不是有特定支持的,所以使用一些更费的格式来模拟的,比如上面的一些16bit的和32bit的一个速度
  • texture filter:
    • trilinear效率可能最多到blinear的2倍
    • anisotropic的则是bilinear的n倍,n的数量是anisotropic里面的tap数
    • gather指令特棒,能用就用
  • compute shader,dx11头号大杀器
    • thread group shared memory
    • atomic operations
    • synchronization
    • 不过compute shader和cpu端很像,同样的部分就不记了,think in hardware

继续阅读