工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下效率优化
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阶段)
- 这里有一些格式不是有特定支撑的,所以应用一些更费的格式来模拟的,比如面上的一些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
文章结束给大家分享下程序员的一些笑话语录:
苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)