【问题标题】:Opengl increase in speed after few seconds几秒钟后Opengl速度增加
【发布时间】:2013-02-04 16:58:54
【问题描述】:

我正在开发一个以 OpenGL 作为基础渲染器的渲染引擎。 渲染器在开始时以 150 fps 开始,30 秒左右后 fps 增加到 500。 我已经分别对引擎的每个部分进行了计时,唯一提高速度的部分是 drawMesh 函数,它绑定 [静态] VBO 并调用 glDrawArrays。

我还注释了 glPush 和 glGet 函数,它们的行为与结果相同。

每次我运行引擎时都会发生这种情况,即使相机没有移动并保持渲染完全相同的场景。

有人知道这是怎么发生的吗?

【问题讨论】:

  • 我认为这是硬件缓存机制的结果。 GPU 的工作方式与 CPU 有点相似,因为它们具有超高速缓存、L2、有时是 L3,然后是外部 RAM。您可能会看到 GPU 最终将所有内容按顺序排列到 GPU 中的结果,这是在几帧后最有效的绘图方式。传输到 GPU 时的所有数据都将从传输到外部 RAM 开始,因为没有 DMA 引擎能够将数据直接推送到 GPU 缓存。在 GPU 引入它并了解要交换的内容和不交换的内容后,性能会变得更好。
  • 很遗憾,仅从软件的角度来说,当我们调用opengl时,很难说之后硬件对它做了什么。因此,这在某种程度上是一个开放式问题和答案。
  • 我也在考虑同样的事情,但是当我将我的 VBO 设置为动态时也会发生同样的情况,而且屏幕上几乎没有,6 个纹理和大约 10 万个顶点。但这仍然是一种可能性,而且很难说硬件上到底发生了什么。
  • 我认为缓存只能解释第一帧很慢。在第一帧之后,缓存是“温暖的”,并且所有后续帧的性能对于静态场景应该是相同的。

标签: opengl


【解决方案1】:

问题

问题是由于 VBO 在创建后被映射到缓冲区。模型类执行一次以更新其边界;并在粒子使用所需数据更新缓冲区的情况下。

似乎显卡(或至少在我的情况下具有 Geforce GTS 450)在取消映射 VBO 后不会将数据直接复制回显卡中,特别是在使用用于映射缓冲区的 GL_READ_WRITE_ARB 标志。它会将数据在外部 RAM 中保存几秒钟,然后再将数据复制回 VRAM。

解决方案

通过使用 GL_READ_ONLY_ARB 标志来映射应该只读取数据的数据,缓冲区将几乎直接复制回 VRAM。然而,在我的情况下,在网格对话期间计算边界并且在为此目的创建 VBO 后根本不访问数据会更有效。

【讨论】:

    【解决方案2】:

    可能是因为着色器是在首次使用前即时编译的。

    看看GL_ARB_get_program_binary

    此外,在初始化阶段加载着色器时,尝试使用着色器渲染三角形(可能会在屏幕外执行此操作)。

    【讨论】:

    • 我正在使用 ubershaders。所以是的,着色器是在运行时构建的,但是在编译和渲染所有内容后,速度增加大约 30 秒。第一次运行后不会构建新的着色器,因为这是一个非常简单的测试场景。
    • 不确定我是否同意这个答案,好像显示已经发生后性能提高了,那么即时编译已经发生,否则真的不会有任何显示正在进行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多