Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化

原文: Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化


第一章:向量代数
一、向量计算的时候,使用XMVECTOR(能够利用SIMD优势);类成员变量使用XMFLOAT2 (2D),XMFLOAT3 (3D),和XMFLOAT4 (4D) 。
二、向函数传递参数的时候(XMVECTOR能够直接传递到SSE/SSE2)前三个参数类型要定义为FXMVECTOR; 第四个要定义为GXMVECTOR; 第五个和第六个要定义为HXMVECTOR; 其余参数要定义为CXMVECTOR。算法


第二章:矩阵代数
一、用以计算的时候使用XMMATRIX类型;类的成员变量使用XMFLOAT4X4;
二、向函数传递参数时,规则和XMVECTOR同样;
三、上述规则对于构造函数是例外,构造函数一直使用CXMMATRIX,而且不要添加XM_CALLCONV。数组


第三章:变换
一、正交矩阵的逆矩阵和它的转置矩阵相等,因此计算起来更高效;
二、根据矩阵的乘法结合律,咱们能够将多个变换矩阵合成为一个变化矩阵。性能优化


第四章:Direct 3D初始化
一、为了优化全屏模式下的性能,准确匹配显示模式就很重要,好比刷新频率。markdown


第五章:渲染流水线
一、类成员变量XMCOLOR,计算时使用XMVECTOR;
二、128位颜色用来进行高精度的计算,这样算法上的错误积累就少不少;最终颜色通常保存为32位(在back buffer中也一般是32位),当前的物理显示设备没法体现128位颜色的好处;ide


第六章:在Direct3D中绘制
一、若是PS上裁切像素,尽量早clip掉,由于这样像素不会进行后面的PS计算;
二、对于硬件优化,一个像素片断是有可能直接跳过像素着色器,好比(early-z rejection),可是在有些状况下,这个功能会没法使用,好比若是像素着色器中修改了Z值,那么每一个像素必须进行像素着色器计算后才能获得最终的Z值;函数


第七章:在Direct3D中绘制(二)
一、不要在着色器中使用太多的常量缓冲,为了性能[Thibieroz13]建议保持在5个如下;
二、每个绘制调用都会以当前设置的根参数对象状态来执行。这样能够正常执行,由于硬件会为每个绘制调用自动保存一份根参数对象的snapshot。也就是说根参数对象会在每次绘制调用中自动进行版本管理。为了性能优化,咱们应该尽量让根签名更小,其中一个缘由是每一个绘制调用中对根参数对象的自动版本管理,根签名越大,须要的开销就越大。更进一步,SDK文档建议跟参数应该根据改变的频率来排序(从高到低),而且尽量减小根签名的切换。因此在多个PSO中共享一个根签名是一个不错的主意。因此建立一个“super”根签名在多个着色器程序中共享,即便部分参数在部分着色器中不须要使用,也能够优化性能。可是若是这个“super”根签名太大就会让减小切换得到的好处变小。性能


第八章:光照
一、全局光照的计算量没法应用到实时程序,游戏中通常使用局部光照。学习


第九章:贴图
一、咱们能够将多个图片放到一个大纹理中(texture atlas),而后应用于多个物体。这样能够避免屡次资源加载,减小DrawCall,优化性能;
二、使用DDS格式文件,GPU能够直接原生使用不少它的文件格式;而且它支持压缩,可让GPU原生解压缩;
三、根据DX11的文档:定义完整类型的格式,能够进行运行时的优化。也就是说为了性能,只有当你真正须要无类型格式,不然都定义成完整类型的格式;测试


第十章:混合
一、混合操做是须要更多的逐像素计算,因此是消耗较多的性能,因此只有当须要使用的时候打开它,使用完成后就关闭它;
二、Alpha测试会消耗性能,因此只有当咱们须要的时候再开启它;优化


第十一章:模板测试
一、显卡可能会每帧在同一个点上绘制屡次,这种覆盖会影响到性能,由于它在重复绘制看不到的点。因此测量深度复杂度对优化分析就颇有用;
二、深度测试时在输出合并阶段执行的(像素着色器以后)。因此即便像素后续会被放弃,可是仍是会进行很耗时的像素着色器计算。可是现代的显卡提供了一个叫早期Z测试(early z-test)的技术,可让Z测试在像素着色器以前进行。为了可以获得这个技术带来的重要的好处,你须要在绘制没有混合的物体的时候,进行从前日后的顺序进行绘制,这样最近的物体会先绘制,而后被遮挡的物体会被这个early z-test技术剔除,它会对具备高深度复杂度的场景带来大量的性能提高。对于early z-test技术咱们没法使用D3D API进行控制,它彻底是由显卡驱动断定控制的。好比若是你的像素着色器中修改了像素的Z值,那么early z-test将没法进行;


第十二章:几何着色器


第十三章:计算着色器
一、因此若是你的GPU有16个多处理器,那么你至少要把你的需求划分为16个线程组,这样你全部的多处理器均可以同时计算。为了有更好的性能,你应该为每一个多处理器划分2个线程组,这样就能够切换线程组([Fung10]);
二、硬件把这些线程划分为warps(32个线程为一个warp),而后warps被多处理器以SIMD32来处理。每一个CUDA core处理一个线程而且回顾“Fermi”多处理器,有32个CUDA cores。在D3D中你能够用一个不是32的倍数的值指定一个线程组的大小,可是出于性能考虑,最好仍是指定为warp大小的倍数([Fung10]);
三、尺寸最好是wavefront的倍数(由于同时也是warp的倍数),这样就能够同时兼容两种显卡;
四、作模糊效果时,对于9x9的矩阵,咱们须要81个采样。可是分离到2个1D的时候,咱们只须要18个采样。尤为咱们是在模糊纹理,纹理提取是很消耗性能的,因此经过分离模糊来减小纹理采样能够提升性能;
五、上面的步骤须要咱们先进行正常的渲染流水线,而后切换到CS进行计算,而后切换回渲染流水线。这样的切换是由开销的([NVIDIA10])应当尽量避免这样的切换;
六、模糊是一个很占用性能的操做,它的运算量主要与纹理的大小相关。通常状况下咱们渲染到纹理的时候,能够渲染到一张比后置缓冲小的纹理上。这样能够提升渲染的纹理的速度;由于尺寸减少了,因此提升了模糊的速度;最终绘制到后置缓冲的时候,由于用了放大滤波器,又增长一层模糊效果;
七、线程组提供共享内存,访问它跟访问硬件cache同样快,它能够用来优化或者一些算法的实现。在CS中,它的定义以下:groupshared float4 gCache[N]; 数组大小能够是任意数,可是不能超过32kb,出于性能考虑,它的大小应该不超过16kb,不然不能让2个线程组指定到用一个多处理器;


第十四章:曲面细分阶段
一、D3D11硬件支持的最大细分因子是64。若是全部细分因子都是0,那么当前patch就拒绝进入后面的阶段。它能够帮助咱们基于patch在背面消除和视锥体裁切上实现优化;
二、具体裁切多少主要基于需求,不要作不须要的裁切来浪费性能;
三、若是细分因子是1(也就是不细分),走一遍细分阶段流程是浪费GPU开销;
四、由于是基于GPU实现的,不要细分一个覆盖小于8个像素的这种过小的三角形;
五、批量调用具备细分的绘制调用(频繁打开和关闭曲面细分很是浪费性能);
六、曲面细分能够优化内存,也能够减小物理和动画运算(在低模上计算),能够实现LOD(之前只能放到CPU);


第十五章:第一人称摄像机和动态索引
一、最小化descriptors可让咱们的根签名更小,这表明每一个绘制调用形成更少的性能开销;


第十六章:实例化和截头锥体裁切


第十七章:拾取
一、为了优化考虑,咱们先进行物体包围体检测,只有检测经过的物体再遍历每一个三角形检测;


第十八章:立方体贴图
一、在之前,应用一般优先绘制天空,而后使用它替换掉渲染目标,和深度/模板缓冲。可是“ATI Radeon HD 2000 Programming Guide”反对这个作法,缘由有下:第一,深度/模板缓冲会为了内部硬件优化被明确的清空掉,对于渲染目标也是同样的;第二,由于大部分天空都是被其余物体好比建筑和地形遮挡的,因此若是咱们先绘制天空,会致使不少像素须要从新绘制,这样很浪费性能。因此如今推荐最后再清空和绘制天空;


第十九章:法线贴图
一、若是你要使用压缩纹理格式保存法线贴图,使用BC7 (DXGI_FORMAT_BC7_UNORM)格式是最好的效果,它能够减小由压缩法线贴图形成的错误;


第二十章:阴影贴图
一、目前为止,咱们使用4次测试的PCF内核,更大的内核会获得更平滑的边缘,可是会更消耗性能。观察上面的例子,其实只须要在边缘进行PCF,内部是不须要的,根据这个需求,衍生出了其余算法。[Isidoro06b]描述了一种方案,在着色器代码中须要动态分支:只有在边缘进行PCF。这种检测边缘又会带来其余性能开销,因此选择方案的时候要作好利弊分析;
二、这里像素着色器没有返回值,是由于咱们只输出深度值。像素着色器只用以裁剪透明的像素片断。若是不须要根据透明度进行裁剪,咱们能够设置像素着色器为null,这样可让性能更高;
三、若是渲染阴影贴图的时候包含曲面细分几何体,咱们须要曲面细分要和摄像机渲染时的细分保持一致;也就是说相机与物体的距离和光源与物体的距离要差很少,不然阴影会出现错误。一种优化的方案是,渲染阴影贴图的时候不使用曲面细分。(这种优化用准确性交换速度);
四、构造函数经过分辨率和viewport来建立纹理。分辨率影响了阴影的效果,高分辨率会须要更多性能开销和内存;
五、PCF的缺点在于它须要4次采样,在现代显卡上,采样操做是很费性能的操做之一,由于GPU的内存带宽和延时并无像它计算能力那样获得提升[Möller08]。幸运的是,DX11图形硬件内置了支持PCF的方法SampleCmpLevelZero;


第二十一章:环境光遮蔽
一、实时程序使用屏幕空间环境光遮蔽(SSAO),没法使用光线追踪环境光遮蔽,由于计算量太大;
二、为了性能,SSAP贴图使用半分辨率;


第二十二章:四元数


第二十三章:角色动画

相关文章
相关标签/搜索