我正在使用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();
}
你怎么看?你如何组织主循环?
答案 0 :(得分:2)
我个人开始使用多线程。我有一个用于对象更新的线程,一个用于对象冲突的线程和一个用于绘制的线程。每个线程都以while (GetMessage())
循环,线程将消息从一个发送到另一个。
在每个周期(帧),我的主循环向每个线程发送一条消息:
这就是我的表现(至少在我的GDI / GDI +游戏中)。不确定是否是最好的方式,但到目前为止它的作用就像一个魅力:)。
答案 1 :(得分:1)
此类问题的有用模式是State Pattern和Strategy Pattern
你可以看到他们都很相似。策略模式比State简单一点,但作为交换,State Pattern更强大,可能更适合像这样的游戏引擎。你也可以轻松地创建一个堆栈,例如:game start - >菜单 - >游戏运行 - >菜单。
如果最后一个菜单的父状态是游戏运行,则菜单看起来不同(例如,在第一个菜单中“返回游戏”而不是“开始游戏”)。状态可以弹出,您可以轻松导航。
答案 2 :(得分:0)
使用回拨应该没问题。请注意不要在标题中包含任何循环依赖项。值得注意的是,将控制器循环的头部包含在控制器循环的.cpp以外的任何位置都是一个坏主意。
至于运行时的好处,它们非常小。 if-else方法不会明显减慢你的游戏速度。或者,还有switch语句,它在代码可读性方面优于一系列if-else语句。