【发布时间】: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