首页 > 解决方案 > 设计游戏循环

问题描述

我正在开发一个简单的 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 闭包中进行更新和渲染内容,还是while像在 #2 方法中那样仅在循环块中进行更新和渲染?

标签: c++windowswinapivisual-c++

解决方案


答案完全取决于用例。

在您的第一种方法中,您在更新游戏状态之前处理队列中的任何消息。这可能会使您免于一些更新,这些更新是由较新的消息过时的旧消息引起的。

但是,在负载很重的队列上,这可能会导致您的应用程序反应不佳甚至冻结。

第二种方法通过始终更新游戏状态来避免这种情况。

第一种方法可能会变得更健壮,例如在强制执行更新之前只允许处理最大数量的消息。


推荐阅读