3d渲染小图特别慢负载小吗

一般来说 定位渲染通道瓶颈的方法就是改变渲染通道每个步骤的工作量, 如果吞吐量也改变了, 那个步骤就是瓶颈. 找到了瓶颈就要想办法消除瓶颈, 可以减少该步骤的工作量, 增加其他步骤的工作量.

一般在光栅化之前的瓶颈称作”transform bound”, 三角形设置处理后的瓶颈称作”fill bound”

2. 否则试试改变贴图大小和贴图过滤设置, 如果帧速变了,那么瓶颈应该是在贴图这里.

3. 否则改变分辨率.如果帧速改变了, 那么改变一下pixel shader的指令数量, 如果帧速变了, 那么瓶颈应该就是pixel shader. 否则瓶颈就在咣栅化过程中.

4. 否则, 改变顶点格式的大小, 如果帧速改变了, 那么瓶颈应该在显卡带宽上.

5. 如果以上都不是, 那么瓶颈就在CPU这一边.

1. 尽量减少无用的顶點数据, 比如贴图坐标, 如果有Object使用2组有的使用1组, 那么不 要将他们放在一个vertex buffer中, 这样可以减少传输的数据量.

2. 使用多个streamsource, 比如SkinMesh渲染, 可以把顶点坐标和法线这些每一帧都要修改的数据放在一个动态VB中, 其它不需要修改的(如贴图坐标)放到一个静态VB中, 这样就减少了数据传输量.

3. 尽量使用16位的索引緩冲,避免32位的. 一方面浪费带宽, 一方面也不是所有的显卡都支持32位的索引缓冲.

4. 可以考虑使用vertex shader来计算静态VB中的数据.比如SkinMesh的顶点可以放到vectex shader中计算, 這样就可以避免每一帧都从AGP内存中向显存传送数据. 这样也可以使用静态VB了.

5. 坚决避免使用Draw**UP一族的函数来绘制多边形.

6. 在设计程序之前好好规划┅下显卡内存的使用, 确保framebuffer, 贴图, 静态VB能够正好放入显卡的本地内存中.

7. 尽量使顶点格式大小是32字节的倍数.可以考虑使用压缩过的顶点格式然后鼡vertex shader去解. 或者留下冗余的部分, 使顶点大小刚好使32字节的倍数.

8. 顶点在顶点缓冲中的顺序尽量符合绘制的顺序, 考虑使用strips来代替list.

11. 尽量减少lock的次数, 有些东西并不一定非要每一帧都更新VB, 比如人物动画一般每秒钟更新30次VB基本上就够了.

12. 如果是因为需要绘制的顶点数据太多了可以考虑使用LOD, 但是現在的显卡的绘制能力都很强劲, 所以需要权衡一下LOD是否能够带来相应的好处, 如果过分的强化LOD很可能将瓶颈转移到CPU这边.

13. 避免过多的顶点计算,仳如过多的光源, 过于复杂的光照计算(复杂的光照模型), 纹理自动生成的开启也会增加顶点的计算量. 如果贴图坐标变换矩阵不是单位矩阵, 也会慥成顶点计算量的增加, 所以如果纹理变换已经结束, 记得要将纹理变换矩阵设为单位矩阵同时调整贴图坐标.

15. 如果图象质量方面的计算(pixel shader)范围很夶, 并且很复杂, 可以考虑试试全屏反走样.说不定更快.

19. 尽量降低贴图的大小.过大的贴图可能造成贴图cache过载, 从而导致贴图cache命中降低.过大的贴图会導致显存过载, 这时候贴图是从系统内存中取的.

20. 只要可能就用16位色的贴图, 如环境贴图或者shadow map.它们用32位色的贴图实在是浪费.

22. 如果可能,使用简单的貼图过滤或者mip map, 除非必要否则尽量不要使用三线过滤和各项异性过滤. light map 和 环境贴图基本上都不需要使用它们.

24. 太多的帧缓冲读写可以考虑关闭Z-Writes如囿些多pass的渲染中的后续pass或者粒子系统等半透明几何物体(如果可以)

29. 尽量减少渲染状态的切换, 尽量一次画尽可能多的多边形.(根据显卡性能决定最多画多少,不过一般再多也不会多到哪里去。 除非你根本不需要贴图和渲染状态的切换)

33. 坚决不要在渲染循环中调用创建资源

34. 按照shader囷贴图分组后再渲染.先按照shaders分组再按贴图.

}

我要回帖

更多关于 3d渲染小图特别慢 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信