2009-07-26 79 views
3

如何以500 - 800 FPS的更高帧频运行OpenGL应用程序(比如游戏)?如何让游戏的FPS(使用OpenGL)达到800 FPS

举个例子,AOE 2的运行速度超过700 FPS(我知道它是关于DirectX的)。尽管我只是在游戏循环中清除缓冲区和交换缓冲区,但我只能获得大约200(最大)的FPS。我知道FPS并不是一个好消息(也取决于硬件),但我觉得我错过了OpenGL中的一些概念。我有吗?请任何人都可以给我一个提示?

+3

你想做什么?眼睛只能达到每秒30帧。 – 2009-07-26 11:58:16

+1

大声笑,我知道我知道。我以160 FPS开始我的比赛,现在增加3个瓦片层和其他单位和建筑物后,我只能获得大约24个FPS。所以,我觉得我错过了什么.. :( – Morpheus 2009-07-26 12:03:21

+0

除了事实,大多数屏幕只能**显示**每秒60帧,这真的很重要吗? – 2009-07-26 12:09:30

回答

2

AOE 2是DirectDraw应用程序,而不是Direct3D。没有办法比较OpenGL和DirectDraw。

另外,检查您用于交换缓冲区的方法。在Direct3D中有flip方法,copy方法和discard方法。最好的是放弃,这意味着你不关心缓冲区中的先前内容,并允许驱动程序有效地管理它们。

0

你似乎错过了一件事(从你的回答/评论来看,如果我错了,那么纠正我)是你需要确定要渲染的东西。

例如,如你所说你有多个图层等等,那么你需要做的第一件事就是不要渲染任何不在屏幕上的东西(这是可能的,有时会这样做)。你也应该做的不是渲染你确定不可见的东西,例如,如果顶层的某些区域不透明(或填满),你不应该渲染它下面的图层。

一般来说,我想说的是,在大多数情况下,消除逻辑中的不可见事物比渲染所有东西更好,只是让渲染图像中的东西最终落入顶端。

3

我得到了一个空的显示循环(GeForce 260 GTX,1920x1080)大约5.600 FPS。添加glClear降低到4.000 FPS,仍然超过200 ... 一个简单的图形引擎(AoE2风格)应该运行在大约100-200 FPS(GeForce 8或类似)。可能更多,如果它是多线程和完全优化。

我不知道你在循环中究竟做了些什么或者运行了什么硬件,但是200个FPS的声音像你除了画什么以外还做其他事情(睡眠?游戏逻辑?贪婪框架?Aero?) 。即使两个帧缓冲区都必须被复制,swapbuffer函数也不需要5ms。你可以使用一个配置文件来检查最花费CPU时间的地方(虽然gl *函数的计时结果大部分是无用的),但如果你正在做OpenGL的工作(绘制东西,创建纹理等),有一个测量时间称为GL_EXT_timer_query的很好的扩展。

一些一般性的优化建议:

  • 不使用即时模式(在glBegin/glEnd),使用VBO和/或显示列表+顶点数组来代替
  • 使用一些剔除技术去除之外的对象你视图(OpenGL的将不得不单独挑出每个多边形)
  • 尽量减少状态的变化,特别是在更改绑定的纹理或顶点缓冲
0

如果你的纹理小,尝试将它们结合在一个更大的纹理中,并通过纹理坐标来处理它们。这将为您节省很多状态变化。如果你的纹理是例如128x128,你可以把它们中的16个放在一个512x512纹理中,使纹理相关的状态变化降低16倍。