D3D性能优化
发布日期:2021-06-30 12:14:36 浏览次数:2 分类:技术文章

本文共 1950 字,大约阅读时间需要 6 分钟。

常规
技巧


1 只在必须的时候Clear。

   IDirect3DDevice9::Clear函数通常需要花费较多的
时间,因此要尽量少调用,而且只清空的确需要清空的缓存。


2 尽量减少状态切换。并且将需要进行的状态切换组合在一起设置。

   状态包括RenderState,SamplerState,TextureStageState等


3 纹理尺寸尽可能小


4 从前至后渲染场景中的对象

   从前至后渲染可以尽可能早地精选出不需要绘制的对象和象素


5 使用三角条带代替三角列表和三角扇。为了能更有效利用顶点高速缓存(cache),在排列条带时因考虑尽快重用顶点。


6  根所需要据消耗的系统资源来逐步减少特效。


7 经常性地检测
程序的性能。

   这样可以更容易发现引起性能突变的部分


8 最小化顶点缓存的切换


9 尽可能使用静态顶点缓存


10 对静态对象,对每种FVF使用一个大的静态顶点缓存来保存多个对象的顶点
数据,而不是每个对象使用一个顶点缓存。

   其目的也是减少顶点缓存的切换


11 如果程序需要随机访问AGP内存中的顶点缓存,顶点格式的大小最好是32bytes的倍数。否则,选择合适的最小的格式。

32bytes 也就是8个float数据或2个vector4。


12 使用顶点索引方式渲染,这样可以更有效利用顶点高速缓存。


13 如果深度缓存格式中包含有模版缓存,总是将两者一起Clear。


14 将计算结果和输出的shader指令合并:

// Rather than doing a multiply and add, and then output the data with

//   two instructions:

mad r2, r1, v0, c0

mov oD0, r2


// Combine both in a single instruction, because this eliminates an

//   additional register copy.

mad oD0, r1, v0, c0


建立一个场景对象的数据库,首先使用最低精度的
模型,在保证性能的前提下逐步使用更高精度的模型。密切关注渲染的总的三角面数。


将使用相同渲染状态和贴图的图元集中在一起绘制,这样能尽量减少顶点缓存和状态的切换。并且将状态切换操作集中成一组设置。


尽量减少光源数量,使用环境光来提高亮度。方向光源比点光源和聚光灯更高效,因为光的方向是固定的。使用光照范围参数来剔除不受光照影响的物体。镜面高光几乎使光照计算量加倍,因此只在需要时使用,将D3DRS_SPECULARENABLE设为FALSE,将材质的specular power 设为0,将材质的specular color 设为0。


尽量减小纹理尺寸,这样可以增加纹理被缓存的可能性。尽量减少纹理的切换,将使用同一纹理的对象集中绘制。尽量使用正方形纹理。最快的纹理是256×256,将4张128×128的纹理拼接成256×256使用。


连接World-View Matrix, 将ViewMatrix设为Identity减少矩阵乘法运算。


动态纹理。首先要检查D3DCAPS2_DYNAMICTEXTURES来判断硬件是否支持。

其二,动态纹理不能放在MANAGED pool中。动态纹理总是能锁定,甚至是在D3DPOOL_DEFAULT中。D3DLOCK_DISCARD是合法的。
 
DrawProceduralTexture(pTex)
{

    // pTex should not be very small because overhead of
    //   calling driver every D3DLOCK_DISCARD will not
    //   justify the performance gain. Experimentation is encouraged.
    pTex->Lock(D3DLOCK_DISCARD);
    <Overwrite *entire* texture>
    pTex->Unlock();
    pDev->SetTexture();
    pDev->DrawPrimitive();
}

当需要在每帧里锁定顶点或索引缓存是,应该使用动态缓存(D3DUSAGE_DYNAMIC)。对动态缓存使用D3DLOCK_DISCARD锁定能减少延迟。D3DLOCK_NOOVERWRITE锁定可以用于在缓存空闲处添加新的数据而不修改已经写入的数据。

使用Effect时,应该根据Effect,然后根据Technique来安排渲染顺序,也就是使用相同Effect和Technique的物体应该集中绘制。这样可以减少状态切换开销。

转载地址:https://jadeshu.blog.csdn.net/article/details/8799961 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MFC消息顺序
下一篇:DirectX常用 选项

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月12日 21时14分49秒