如果您正在尝试编写游戏,您真的不应该等待WM_PAINT
来自 O/S 的信号绘制。您应该尽快重复绘制。
那么为什么在 D3D 示例代码中发生渲染WM_PAINT
?
如何在不等待来自 O/S 的信号的情况下重新处理 D3D12 样本以尽快渲染?WM_PAINT
如果您正在尝试编写游戏,您真的不应该等待WM_PAINT
来自 O/S 的信号绘制。您应该尽快重复绘制。
那么为什么在 D3D 示例代码中发生渲染WM_PAINT
?
如何在不等待来自 O/S 的信号的情况下重新处理 D3D12 样本以尽快渲染?WM_PAINT
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
是一个执行Update
and的方法Render
,但根据它的模式,每帧StepTimer
可能调用Update
不止一次。
最后,两个 Win32 的“消息泵”实现了基本相同的目标。