我们如何以 500 - 800 FPS 的更高帧速率运行 OpenGL 应用程序(比如游戏)?
例如,AOE 2 以超过 700 FPS 的速度运行(我知道它与 DirectX 有关)。尽管我只是在游戏循环中清除缓冲区和交换缓冲区,但我只能获得大约 200(最大)FPS。我知道 FPS 不是一个很好的解决方案(并且还取决于硬件),但我觉得我错过了 OpenGL 中的一些概念。我有吗?请问有人可以给我一个提示吗?
我们如何以 500 - 800 FPS 的更高帧速率运行 OpenGL 应用程序(比如游戏)?
例如,AOE 2 以超过 700 FPS 的速度运行(我知道它与 DirectX 有关)。尽管我只是在游戏循环中清除缓冲区和交换缓冲区,但我只能获得大约 200(最大)FPS。我知道 FPS 不是一个很好的解决方案(并且还取决于硬件),但我觉得我错过了 OpenGL 中的一些概念。我有吗?请问有人可以给我一个提示吗?
我得到大约 5.600 FPS 与空显示循环(GeForce 260 GTX,1920x1080)。添加 glClear 将其降低到 4.000 FPS,仍然超过 200... 一个简单的图形引擎(AoE2 风格)应该以大约 100-200 FPS(GeForce 8 或类似的)运行。如果它是多线程且完全优化的,可能会更多。
我不知道你在你的循环中到底做了什么或者在什么硬件上运行,但是 200 FPS 听起来你除了什么都不画之外还在做其他事情(睡眠?游戏逻辑的东西?贪婪的框架?Aero?)。即使必须复制两个帧缓冲区,swapbuffer 函数也不应该花费 5ms。您可以使用配置文件来检查花费最多 CPU 时间的位置(虽然 gl* 函数的计时结果大多没用)
如果您正在使用 OpenGL 做一些事情(绘制东西、创建纹理等),那么有一个很好的扩展来测量时间,称为GL_EXT_timer_query。
一些通用的优化技巧:
AOE 2 是 DirectDraw 应用程序,而不是 Direct3D。没有办法比较 OpenGL 和 DirectDraw。
此外,请检查您用于交换缓冲区的方法。在 Direct3D 中有翻转方法、复制方法和丢弃方法。最好的一种是丢弃,这意味着您不关心缓冲区中以前的内容,并允许驱动程序有效地管理它们。
您似乎错过的一件事(从您的回答/评论来看,如果我错了,请纠正我)是您需要确定要渲染的内容。
例如,正如您所说,您有多个图层等,那么您需要做的第一件事就是不要渲染屏幕外的任何内容(这是可能的,有时会完成)。您还应该做的是不要渲染您确定不可见的东西,例如,如果顶层的某些区域不透明(或填充),您不应该渲染它下面的层。
一般来说,我想说的是,在大多数情况下,消除逻辑中的不可见事物比渲染所有事物并让顶部的事物最终出现在渲染图像中要好。
如果您的纹理很小,请尝试将它们组合成一个更大的纹理并通过纹理坐标来处理它们。这将为您节省大量状态更改。如果您的纹理是 128x128,您可以将其中的 16 个放在一个 512x512 纹理中,从而将与纹理相关的状态更改降低 16 倍。