Opengl在几秒钟后提高了速度

Opengl在几秒钟后提高了速度,opengl,Opengl,我正在开发一个以OpenGL为基本渲染器的渲染引擎。 渲染器以150 fps开始,30秒左右后,fps增加到500。 我分别对引擎的每个部分进行了计时,唯一提高速度的部分是drawMesh函数,它绑定了[static]VBO并调用GLDrawArray 我还用与result相同的行为对glPush和glGet函数进行了注释 每次我运行引擎时都会发生这种情况,即使相机没有移动并且仍然渲染完全相同的场景 有人知道这是怎么发生的吗?可能是因为着色器在第一次使用之前就被及时编译了 看看 另外,在初始化阶

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

我还用与result相同的行为对glPush和glGet函数进行了注释

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


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

可能是因为着色器在第一次使用之前就被及时编译了

看看


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

问题

问题产生于VBO在创建后映射到缓冲区。模型类执行此操作一次以更新其边界;如果是粒子,则使用所需数据更新缓冲区

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

解决方案


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

我认为这是硬件缓存机制的结果。GPU的工作原理有点类似于CPU,因为它们有超高速缓存、L2,有时是L3,然后是外部RAM。您可能看到的是,GPU最终以最有效的方式将所有内容有序地放入GPU,以便在几帧后进行绘制。由于没有DMA引擎能够将数据直接推送到GPU缓存,因此传输到GPU的所有数据都将首先传输到外部RAM。当GPU引入它,并学会了交换什么和不交换什么之后,性能会变得更好。不幸的是,仅仅从软件的角度来说,当我们调用opengl时,很难说出硬件在那之后用它做了什么。因此,这是一个开放式的问题和答案。我也在考虑同样的问题,但当我将VBOs设置为动态时,情况也是一样的,而且屏幕上几乎没有6个纹理和大约100k个顶点。但这仍然是一种可能性,而且很难说硬件上到底发生了什么。我认为缓存只能解释第一帧速度慢的原因。在第一帧之后,缓存是“温暖”的,并且对于静态场景,所有后续帧的性能应该是相同的。是的,着色器是在运行时构建的,但是在编译和渲染所有内容后,速度会提高30秒左右。第一次运行后不会生成新的着色器,因为这是一个非常简单的测试场景。我不确定是否同意这个答案,因为如果在显示已经发生后性能有所提高,那么即时编译已经发生,否则就不会有任何显示正在进行!