设计游戏循环
Designing the game loop
我正在开发一个简单的 Win 游戏。这是我对游戏循环的 2 个类似实现(在 C++ 中):
方法 #1:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else {
// Do update, rendering and all the real game loop stuff
}
}
方法 #2:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
// Do update, rendering and all the real game loop stuff
}}
我的问题是哪个更好,我应该选择哪个?是像#1 方法那样在 else 闭包中进行更新和渲染,还是像在#2 方法中那样只在 while
循环块中进行更新和渲染?
答案完全取决于用例。
在您的第一种方法中,您在更新游戏状态之前处理队列中的所有消息。这可能会让您省去一些由较新的消息过时的旧消息引起的更新。
但是,在负载很重的队列中,这可能会导致您的应用程序反应迟钝甚至死机。
第二种方法通过始终更新游戏状态来避免这种情况。
第一种方法可能会得到更健壮的 e。 G。通过在执行更新之前只允许处理最大数量的消息。
我正在开发一个简单的 Win 游戏。这是我对游戏循环的 2 个类似实现(在 C++ 中):
方法 #1:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else {
// Do update, rendering and all the real game loop stuff
}
}
方法 #2:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
// Do update, rendering and all the real game loop stuff
}}
我的问题是哪个更好,我应该选择哪个?是像#1 方法那样在 else 闭包中进行更新和渲染,还是像在#2 方法中那样只在 while
循环块中进行更新和渲染?
答案完全取决于用例。
在您的第一种方法中,您在更新游戏状态之前处理队列中的所有消息。这可能会让您省去一些由较新的消息过时的旧消息引起的更新。
但是,在负载很重的队列中,这可能会导致您的应用程序反应迟钝甚至死机。
第二种方法通过始终更新游戏状态来避免这种情况。
第一种方法可能会得到更健壮的 e。 G。通过在执行更新之前只允许处理最大数量的消息。