performance - OpenGL低级性能问题

标签 performance optimization opengl sdl opengl-3

与任何优化问题一样,该主题也受到很多关注,但我只是找不到我想要的东西。

很多教程,甚至SO问题也有类似的技巧。一般涵盖:

  • 使用GL人脸剔除(OpenGL功能,而不是场景逻辑)
  • 仅向GPU发送1个矩阵(projectionModelView组合),因此将MVP计算从每个顶点减少到每个模型一次(应如此)。
  • 使用交错的顶点
  • 最小化尽可能多的GL调用,在适当的位置批处理

  • 可能还有其他几个。由于好奇心,我正在使用几个顶点缓冲区在应用程序中渲染2800万个三角形。据我所知,我已经尝试了所有上述技术,但是几乎没有性能变化。

    虽然我在实现过程中收到了大约40FPS的数据,这绝不是问题,但我仍然对这些优化“技巧”实际上在哪里使用感到好奇?

    在渲染过程中,我的CPU空转了20%到50%,因此我认为我必须提高性能。

    注意:我目前正在研究gDEBugger

    交叉发布在Game Development

    最佳答案

    要点1很明显,可以节省填充率。如果首先处理对象背面的图元,则将忽略这些面。但是,现代GPU可以很好地承受 overdraw 。我曾经(GeForce8800 GTX)测得高达20%的 overdraw 率,然后才出现明显的性能下降。但是最好将此预留空间用于遮挡剔除,混合几何体的渲染等。

    第二点是毫无意义的。从来没有在GPU上计算过矩阵-如果您不计算SGI Onyx的话。矩阵始终只是某种形式的渲染,用于在CPU上计算全局参数,然后将其 push GPU上的全局寄存器(现在称为统一寄存器),因此将它们连接起来几乎没有什么好处。在着色器中,仅保存一个附加的 vector 矩阵乘法(归结为4个MAD指令),但算法灵活性较低。

    第三点是关于缓存效率的。属于一起的数据应适合高速缓存行。

    第4点是关于防止状态更改破坏高速缓存。但这在很大程度上取决于GL所指的含义。换制服很便宜。切换纹理非常昂贵。原因是,统一存储在寄存器中,而不是缓存的某些内存。切换着色器很昂贵,因为不同的着色器表现出不同的运行时行为,从而破坏了管道执行前提,改变了内存(从而改变了缓存访问模式)等等。

    但是这些全都是微观优化(其中一些影响巨大)。但是,我建议您进行较大的影响优化,例如实现早期的Z传递;在Z早期使用遮挡查询快速识别整个几何批次。一个大的影响优化(基本上包括像微优化一样总结很多Point-4)是按昂贵的GL状态对渲染批次进行排序。因此,请使用通用着色器对所有内容进行分组,在这些分组中按纹理排序,依此类推。此状态分组将仅影响可见的渲染过程。在早期的Z中,您仅在Z缓冲区上测试结果,因此只有几何变换,并且片段着色器将仅传递Z值。

    关于performance - OpenGL低级性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5243411/

    相关文章:

    c# - 简化winforms代码跨线程调用

    c++ - 在 OpenGL 中使用 vbo 绘制圆柱体

    c++ - 使用多个处理器加速程序

    python 风格 : inline function that needs no inlining?

    mysql - 在表副本上运行优化?

    c++ - 将光照应用于 gl_Quad 中的特定复选框

    macos - OSX 10.8 OpenGL扩展

    python - 在 python 中使用 pyglet,如果我拖动鼠标,为什么我的帧速率会加快?

    sql - 在 mysql 中,通过表的其中一个列中的不同值仅获取表中行的有效方法是什么?

    c# - 如何优化下面的代码