我们如何以更高的帧速率运行OpenGL应用程序(比如游戏),如500 - 800 FPS?
举个例子,AOE 2的运行速度超过700 FPS(我知道它是关于DirectX的)。虽然我只是在游戏循环中清除缓冲区和交换缓冲区,但我只能获得大约200(最大)FPS。我知道FPS不是一个好的混乱(也取决于硬件),但我觉得我错过了OpenGL中的一些概念。我有吗?请任何人可以给我一个提示?
答案 0 :(得分:3)
我得到大约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。
一些常规优化提示:
答案 1 :(得分:2)
AOE 2是DirectDraw应用程序,而不是Direct3D。没有办法比较OpenGL和DirectDraw。
另外,请检查您用于交换缓冲区的方法。在Direct3D中有翻转方法,复制方法和丢弃方法。最好的是丢弃,这意味着您不关心缓冲区中的先前内容,并允许驱动程序有效地管理它们。
答案 2 :(得分:0)
你似乎错过了一件事(根据你的答案/评论判断,如果我错了,请纠正我)是你需要确定要渲染的内容。
例如,正如你所说,你有多个层等等,你需要做的第一件事就是不渲染任何屏幕外的东西(这是可能的,有时也会完成)。您还应该做的不是渲染您确定不可见的东西,例如,如果顶层的某些区域不透明(或填充),则不应渲染其下方的图层。
一般来说,我想说的是,在大多数情况下,消除逻辑中的不可见事物比渲染所有事物更好,只是让事物最终在渲染图像中结束。
答案 3 :(得分:0)
如果您的纹理很小,请尝试将它们组合在一个更大的纹理中,并通过纹理坐标对它们进行处理。这将为您节省很多状态变化。如果你的纹理是128x128,你可以将16个纹理放在一个512x512纹理中,使纹理相关的状态变化降低16倍。