GDI 窗口中的游戏循环/一段时间后不刷新并崩溃

Game loop in GDI window / doesn't refresh and crashes after a while

本文关键字:刷新 崩溃 一段时间 窗口 游戏 循环 GDI      更新时间:2023-10-16

这是我当前在普通窗口中的游戏循环:

while(running)
{
    while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    {
        if( msg.message == WM_QUIT )
        {
            running = false;
        }
        TranslateMessage( &msg );
        DrawGame(&game);
        DispatchMessage( &msg );
    }
    UpdateGame(&game);
    InvalidateRect(hwnd, NULL, 1);
    //Sleep(100);
}

。但是我真的应该把DrawGame放在翻译和DispatchMessage之间吗?如果我把DrawGame放在UpdateGame的上方/下方,则不会绘制任何内容。

过了一会儿,如果我画一个简单的矩形,它们开始相互重叠。它运行良好大约一分钟,绘制一个矩形网格(由于以下原因而错位:您设置的窗口大小不是正确的窗口大小。过了一会儿,它会绘制另一个网格,有时它会完全搞砸,窗口似乎已经崩溃,我必须在Visual Studio中按"停止"按钮。

那么,我

究竟在哪里放置游戏循环,我怎么知道何时绘制游戏?我需要主要绘制矩形,尽管这也不太好。

处理WM_PAINT消息时,您应该从Windows消息回调调用DrawGame()。

在消息循环中,您应该只获取 Windows 消息并将其调度到相应的回调。

此外,这也是更新游戏世界的地方,但不是用于进行绘制调用的地方。