0

如果您正在尝试编写游戏,您真的不应该等待WM_PAINT来自 O/S 的信号绘制。您应该尽快重复绘制。

那么为什么在 D3D 示例代码中发生渲染WM_PAINT

如何在不等待来自 O/S 的信号的情况下重新处理 D3D12 样本以尽快渲染?WM_PAINT

4

1 回答 1

1

GitHub 上的“Hello, World”DirectX 12 示例:DirectX-Graphics-Samples依赖于这样一个事实:如果您调用PeekMessage并且没有其他可用消息,它会创建一条WM_PAINT消息:

MSG msg = {};
while (msg.message != WM_QUIT)
{
    // Process any messages in the queue.
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

请参阅Microsoft 文档

通常,游戏渲染循环不依赖于“神奇的 WM_PAINT”行为,而我在GitHub 中拥有的是:directx-vs-templates

MSG msg = {};
while (WM_QUIT != msg.message)
{
    if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else
    {
        g_game->Tick();
    }
}

g_game.reset();

唯一要做的WM_PAINT就是清除屏幕——对调整大小进行特殊处理:

case WM_PAINT:
    if (s_in_sizemove && game)
    {
        game->Tick();
    }
    else
    {
        PAINTSTRUCT ps;
        (void)BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
    }
    break;

Tick是一个执行Updateand的方法Render,但根据它的模式,每帧StepTimer可能调用Update不止一次。

最后,两个 Win32 的“消息泵”实现了基本相同的目标。

于 2021-08-19T04:31:09.400 回答