回调和主要游戏循环。这是一个好习惯吗?

时间:2013-07-24 09:43:18

标签: c++ loops callback game-development

我正在使用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-cases。像这样:

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

你怎么看?你如何组织主循环?

3 个答案:

答案 0 :(得分:2)

我个人开始使用多线程。我有一个用于对象更新的线程,一个用于对象冲突的线程和一个用于绘制的线程。每个线程都以while (GetMessage())循环,线程将消息从一个发送到另一个。

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

  1. 计算已修改对象的碰撞
  2. 更新对象(移动,状态等)
  3. 绘制更新的对象
  4. 这就是我的表现(至少在我的GDI / GDI +游戏中)。不确定是否是最好的方式,但到目前为止它的作用就像一个魅力:)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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