【GDC2003】Optimizing the Graphics

2022-05-14  本文已影响0人  离原春草

坚持学习与自我革新不动摇!

本文是GDC2003上NVidia关于图形管线优化相关的分享文章的学习笔记,原文链接在文末给出。

AGP:Accelerated Graphics Port (AGP),这是一个高速点对点数据传输channel,用于实现CPU到显卡的数据传输,以实现3D图形渲染的加速,这个东西最开始是作为PCI类连接器的接替者而开发设计的。

“transform bound” 意味着瓶颈出现在光栅化阶段之前

“fill bound” 则通常意味着瓶颈发生在setup阶段之后。

瓶颈的定位可以通过调整各个stage的workload,之后测试性能来得到。

性能优化在于消除瓶颈,做法是降低瓶颈Stage的workload,或者增加其他非瓶颈Stage的workload。


定位瓶颈步骤


1.修改RT或者DS Buffer的格式,比如说从16bit改到32bit,看看帧率是否有变化,如果帧率变化了,那么就说明当前是Framebuffer写入的带宽上存在瓶颈。

2.如果没有变化,再修改输入采样贴图的分辨率,比如将mipmap强制改到10+或者将点采样改为线性滤波采样,如果改完之后,分辨率有变化,说明当前是贴图读取的带宽存在瓶颈(也就是说,写入跟读取的带宽需要分开考虑)。

3.如果没变化,再修改RT的分辨率,如果帧率发生变化了,再继续修改pixel shader的复杂度,如果帧率变化了,那就说明当前是PS过于复杂了,否则就说明是光栅化阶段存在瓶颈。

4.如果修改RT分辨率没有导致帧率变化,就修改VS的复杂度,如果帧率变化了,就说明是VS存在瓶颈。

5.否则就修改顶点格式,如果帧率变化,就说明当前是AGP上存在瓶颈。

6.如果上述都没有变化,就说明是CPU阶段存在瓶颈。

这里给出一些测试上的小tips

1.在不同的CPU型号跟同一型号的GPU的机器上,如果帧率存在差异,那么就说明是CPU上存在瓶颈。

2.在bios强制设置AGP = 1x,如果帧率发生变化,那就说明AGP上存在瓶颈。

3.如果对GPU进行降频(underlock),即降低core的时钟频率,会导致性能下降(帧率下降)的话,那就说明可能是顶点变换、光栅化阶段或者PS上存在瓶颈;而如果降低memory(内存还是显存?从后文来看,倾向于显存)的时钟频率导致了性能下降的话,那就说明可能是贴图读取的带宽或者Framebuffer写入的带宽存在瓶颈。


优化建议


  1. 尽可能的避免小批次提交,也就是说,一次性提交十万面片,比十次提交一万面片性能要高
  1. 减少不必要的AGP消耗
  1. 对物件按照离相机先后顺序进行排序,通过硬件自带的Early-Z降低需要处理的数据量

  2. 对需要渲染的物件按照渲染状态进行合批,渲染状态即材质包括:

  1. 使用Occlusion Query减少VS/PS/FS的数据处理量

6.避免资源Lock,如CPU读取贴图内容,如果此时这张贴图正被GPU访问,会导致CPU此时处于空闲状态,敲着二郎腿等待着GPU返回结果


CPU瓶颈


1.可能的原因:

大多数的图形应用程序都是CPU受限的

2.解决方法:


AGP数据传输瓶颈


1.对于AGP 4x来说就不太可能会存在这类的bottleneck,更何况对于当代的AGP 8x?

2.原因主要在于传输了过多的数据:

3.AGP传输的数据格式也会导致AGP受限:

4.优化手段:


Vertex Transform瓶颈


1.这种瓶颈一般比较少见,除非:

2.但是如果出现了这种瓶颈

3.解决方案:


Triangle Setup瓶颈


  1. 这种瓶颈基本上不太可能出现

  2. 受限因素

3.解决方案


光栅化阶段瓶颈 - Raster Bottleneck


受限因素:


PS瓶颈


在固定管线时代,Fragment Shader的设计是能够与其他的Stage匹配得非常良好,之后到了Nvidia 1x时代,虽然Fragment Shader性能因为增加了许多其他的功能而有所下降,但是也不会是瓶颈,Nvdia 3x提高了Fragment Shader的复杂程度,使得DX9的最大PS指令数为512,OpenGL3.0指令数为1024,从而使得复杂的Fragment Shader成为了瓶颈

  1. 具体原因:

其他可能的GPU瓶颈原因


1.贴图尺寸过大

1.1 Shader中贴图采样次数过多

1.2 如何加速贴图上传

1.3 天空盒大概率会导致贴图读取的瓶颈

2.FrameBuffer问题

另外需要注意的是,如果PS复杂度较高,那么此时,即使增加了VS的复杂度,也不会有太多额外的代价,但是却可以得到更好的效果。

参考

[1] Optimizing the Graphics Pipeline

上一篇下一篇

猜你喜欢

热点阅读