2009-07-26 77 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倍。