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();
}

你怎么看待这件事?你如何组织你的主循环?

4

3 回答 3

2

我个人已经开始使用多线程。我有一个用于对象更新的线程、一个用于对象碰撞的线程和一个用于绘图的线程。每个线程都使用 a 循环,while (GetMessage())并且线程将消息从一个发送到另一个。

在每个周期(帧),我的主循环向每个线程发送一条消息:

  1. 计算修改对象的碰撞
  2. 更新对象(运动、状态等)
  3. 绘制更新的对象

我就是这样做的(至少在我的 GDI/GDI+ 游戏中)。不确定是否是最好的方法,但到目前为止它就像一个魅力:)。

于 2013-07-24T09:56:02.917 回答
1

对这类问题有用的模式是状态模式策略模式
如您所见,它们都很相似。策略模式比状态模式更简单,但作为交换,状态模式更强大,可能更适合这样的游戏引擎。您也可以使用它轻松创建堆栈,例如:游戏开始 -> 菜单 -> 游戏运行 -> 菜单。
如果最后一个菜单的父状态是游戏运行,则菜单看起来会有所不同(例如,第一个菜单中的“返回游戏”而不是“开始游戏”)。可以弹出状态,您可以轻松导航。

于 2013-07-25T12:11:06.827 回答
0

使用回调应该没问题。请注意不要在标题中包含任何循环依赖项。值得注意的是,将控制器循环的标头包含在控制器循环的 .cpp 以外的任何位置都是一个坏主意。

至于运行时的好处,它们非常小。if-else 方法不会明显减慢您的游戏速度。或者,还有 switch 语句,就代码可读性而言,它比一系列 if-else 语句更可取。

于 2013-07-24T09:57:06.963 回答