OpenGL 编程/性能
外观
一个常见的陷阱是过分痴迷于优化,以至于在微不足道的优化上花费大量的编码时间,同时使代码复杂化,并使其难以调试。
确保您在有证据证明受影响的代码确实减慢了应用程序速度时进行优化。进行测量。在不同的用例和可能不同的硬件中进行比较。
此外,我们建议在实现新功能时,首先尽可能清晰地编写您的第一个版本,并在功能正常工作后在第二步中进行优化。
在应用程序中衡量性能的一种常见方法是使用 FPS(每秒帧数)。但是,由于 FPS 本身的定义(帧 / 1 秒),它并不能完全传达性能,因为它是非线性的。网上有许多页面完全描述了这一点,但基本思想是:FPS 的线性变化不会导致实际性能的线性变化。从 900 FPS 下降 450 FPS 大约是 1 毫秒的额外时间,但从 60 FPS 下降 5 FPS 大约是 1 毫秒的额外时间。性能下降的程度与 FPS 损失的程度成反比,因此当 FPS 趋向于 0 时,执行时间开始失控地快速增长。然而,您只看到 FPS 的线性变化,因此您只是耸耸肩。
相反,您应该使用帧时间,或者渲染 1 帧所需的时间。虽然这似乎违反直觉,但它提供了一种可靠的方法来衡量代码是否会导致瓶颈。
以下是一段简单的代码,可以在控制台中显示每帧花费的时间(以毫秒为单位)
/* Global */
static unsigned int fps_start = 0;
static unsigned int fps_frames = 0;
/* init_resources() */
fps_start = glutGet(GLUT_ELAPSED_TIME);
/* idle() */
/* FPS count */
{
fps_frames++;
int delta_t = glutGet(GLUT_ELAPSED_TIME) - fps_start;
if (delta_t > 1000) {
cout << delta_t / fps_frames << endl;
fps_frames = 0;
fps_start = glutGet(GLUT_ELAPSED_TIME);
}
}
通常,OpenGL 被配置为在推送新的颜色缓冲区之前等待物理屏幕的垂直刷新。
- 这可以防止撕裂,这是一种混合了部分先前缓冲区和部分新缓冲区的视觉伪像。
- 在视觉上,没有必要显示超过屏幕能够处理的帧数,通常是 60-75Hz(取决于屏幕)。
- 这节省了资源,例如电池。
但是,这意味着即使我们可以显示 200 FPS,我们的应用程序也将被限制在 60-75 FPS,这使得测量性能变得困难。
在这种情况下,禁用垂直同步可能很有用。
- 您的显卡驱动程序可能附带实用程序来启用和禁用它。
- 使用 Mesa,您可以使用
vblank_mode=0
启动应用程序,或在~/.drirc
中更永久地配置此行为;一些早期版本存在错误,因此您可能需要尝试两种方法。
请参阅 模板缓冲区 部分中的性能提示。
浏览和下载 完整的代码