C++ 如何优化动态几何体的渲染?

C++ 如何优化动态几何体的渲染?,c++,opengl,game-development,C++,Opengl,Game Development,据我所知,批处理和实例化用于减少静态网格的绘制调用量。但动态网格呢?如何优化它们的绘制调用量?实例化和批处理 由于每帧都需要使用cpu重新计算位置,因此会产生较大的开销。或者最好使用单独的绘制调用绘制动态网格?需要记住一些性能注意事项: 每个glDraw..()都会带来一些开销,因此您希望尽量减少这些开销。这就是实例化是性能提升的一个原因。(更好的缓存行为是另一个原因。) 主机到设备的数据传输(glBufferData())甚至比draw调用还要慢。因此,我们尝试将数据保存在GPU(顶点缓冲区、

据我所知,批处理和实例化用于减少静态网格的绘制调用量。但动态网格呢?如何优化它们的绘制调用量?实例化和批处理
由于每帧都需要使用cpu重新计算位置,因此会产生较大的开销。或者最好使用单独的绘制调用绘制动态网格?

需要记住一些性能注意事项:

  • 每个
    glDraw..()
    都会带来一些开销,因此您希望尽量减少这些开销。这就是实例化是性能提升的一个原因。(更好的缓存行为是另一个原因。)
  • 主机到设备的数据传输(
    glBufferData()
    )甚至比draw调用还要慢。因此,我们尝试将数据保存在GPU(顶点缓冲区、索引缓冲区、纹理)上,而不是每帧传输数据
  • 在您的例子中,有几种方法可以获得高性能的动态网格

    • 假装。您真的需要动态网格吗?特别是,必须生成新网格数据的网格?或者,可以通过着色器中的变换实现同样的效果吗

    • 在GPU上生成网格。这可以在计算着色器(为了获得最佳性能)或几何体和/或细分着色器中完成。这有其自身的开销,但是,由于所有事情都发生在GPU上,因此您不会受到更昂贵的
      glDraw…()
      或主机GPU拷贝的影响

    • 请注意,几何体着色器相对较慢,但仍比从CPU向GPU复制新的顶点+索引缓冲区快*
    • 如果“动态”网格的状态数有限,只需将它们全部保留在GPU上,并根据需要在它们之间切换即可

    • 如果这是另一个API,如Vulkan,则可以在单独的线程中生成网格,并在绘制其他内容时将其传输到GPU。这是一个非常复杂的主题,与显式图形API相关的所有内容也是如此


    如果对象是动态的,那么每个帧中不都有一组新的顶点吗?或者你真的在谈论带动态变换的静态几何体?截头体剔除以决定是否需要更新。最后一点,可能有OpenGL扩展,允许CPU和GPU之间共享内存。但是,它们可能是特定于平台的,然后您将负责同步