2013-07-24 132 views
1

我正在寫一個使用C++的遊戲。我不知道如何優化我的遊戲循環。例如,我們有一些遊戲的主循環看起來像這樣:回調和主遊戲循環。這是一個好習慣嗎?

while (gameContinue) { 
    if (SCENE == HELP_SCENE) { 
     renderHelpScene(); 
    } else if (SCENE == SCORE_SCENE) { 
     renderScoreScene(); 
    } else if (SCENE == MAIN_GAME_SCENE) { 
     renderMainGameScene(); 
    } // .... and many others scenes 
} 

我在考慮如何使此代碼更快,更輕。我考慮使用回調,所以我們不需要太多的if-case。類似這樣的:

typedef void (*callback_function)(void); 
callback_function renderFunc; 

void renderMainGameScene() { 
    renderFunc = renderScoreScene(); // set to another scene if we need this 
} 
void renderScoreScene() { 
    renderFunc = renderAnyAnotherSceneWeNeedNow(); 
} 

renderFunc = renderMainGameScene(); 
while (gameContinue) { 
    renderFunc(); 
} 

你怎麼看待它?你如何組織你的主循環?

+2

如果這是您遊戲中的瓶頸,您應該很高興。 –

+1

爲什麼不用一個虛擬的'render'方法來創建'AbstractScene'?我同意上面的評論。 – Nbr44

回答

2

我個人已經開始使用多線程。我有一個線程進行對象更新,一個線程用於對象衝突和一個繪製線程。每個線程使用while (GetMessage())循環,線程將消息從一個發送到另一個。

在每個週期(幀),我的主循環將消息發送到每個線程:

  1. 計算碰撞對修改的對象
  2. 更新對象(移動,狀態等)
  3. 畫出更新的對象

這就是我這樣做(至少在我的GDI/GDI +遊戲)。不知道是否是最好的方式,但到目前爲止它的作用就像一個魅力:)。

+0

有趣的想法。你有多少個線程,線程交互的程度如何,這種方法的可伸縮性是多少? – DXsmiley

+0

到目前爲止,我只在**小遊戲**上測試過這種方法(只是爲了適應線程)。我從CAD軟件中得到了這個想法,該軟件有1個用於計算/更新的線程,1個用於繪製對象,所以我相信它具有很好的可擴展性。我有3個線程 - 繪製,碰撞,更新 - 當一個線程或主循環與另一個線程共享某個東西時,我通過傳遞目標線程的ID和一個自定義的msg結構/類來使用PostThreadMessage()。在接收線程()中,我使用'while(GetMessage())'進行循環,並使用'switch()'來處理自定義消息結構。 –

+3

您可能想要說明這種方法的危險性(即基本線程安全性http://en.wikipedia.org/wiki/Thread_safety)。此外,衝突往往嚴重依賴於對象的位置,您在更新線程中看起來正在改變對象的位置。 – DXsmiley

0

使用回調應該沒問題。只是要小心,不要在你的頭文件中有任何循環依賴。值得注意的是,將控制器循環的頭文件包含在控制器循環的.cpp以外的任何位置是個不錯的主意。

至於運行時間的好處,它們非常小。 if-else方法不會顯着減慢你的遊戲速度。另外,還有switch語句,就代碼可讀性而言,它優於一系列if-else語句。

1

這種問題的有用模式是State PatternStrategy Pattern
正如你所看到的,它們都是相似的。戰略模式比國家稍微簡單一些,但作爲交換,國家模式更強大,可能更適合這樣的遊戲引擎。您也可以輕鬆創建一個堆棧,例如:遊戲開始 - >菜單 - >遊戲運行 - >菜單。
如果最後一個菜單的父狀態是遊戲運行,菜單看起來會有所不同(例如,「返回遊戲」而不是第一個菜單中的「開始遊戲」)。州可以彈出,你有一個簡單的導航。

相關問題