CPU和GPU的执行是异步的,CPU发出OpenGL指令后,并不会等待GPU执行完成,而是继续执行后续代码。因此,直接在CPU端测量OpenGL指令的执行时间是不准确的。
glFlush() vs glFinish()
| 方面 | glFlush() | glFinish() |
|---|---|---|
| 作用 | 发送命令到 GPU | 等待 GPU 完全完成 |
| 是否阻塞 CPU | ❌ 不阻塞 | ✅ 阻塞 |
| 返回时机 | GPU 开始处理 | GPU 完全完成 |
| 性能影响 | 低 | 高(可能卡顿) |
| 使用场景 | 优化渲染 | 调试/测量 |
不同场景的最佳实践
| 场景 | 使用 glFlush() | 使用 glFinish() | 使用 glQueryCounter |
|---|---|---|---|
| 正常渲染 | ✅ 推荐 | ❌ 会卡顿 | ✅ 推荐 |
| 调试单帧性能 | ❌ 不准确 | ✅ 准确但卡 | ✅ 准确不卡 |
| 优化 viewport 切换 | ✅ 有效 | ❌ 导致停顿 | N/A |
| 测量精确 GPU 执行时间 | ❌ 误导 | ⚠️ 可以但有代价 | ✅ 最佳 |
| 在生产环境中持续测量 | ❌ 可以但数据不准 | ❌ 会严重降帧 | ✅ 完美 |