gpt4 book ai didi

c++ - Quake 2 中的 Windows 消息循环实现

转载 作者:行者123 更新时间:2023-12-02 10:27:49 27 4
gpt4 key购买 nike

我正在学习 Quake 2源代码,用于学习,获得经验,只是为了纯粹的乐趣。有一个入口点——经典的代码块——Windows msg 循环。这是它的样子:

while (1)
{
// if at a full screen console, don't update unless needed
if (Minimized || (dedicated && dedicated->value) )
{
Sleep (1);
}

while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage (&msg, NULL, 0, 0))
Com_Quit ();
sys_msg_time = msg.time;
TranslateMessage (&msg);
DispatchMessage (&msg);
}

do
{
newtime = Sys_Milliseconds ();
time = newtime - oldtime;
} while (time < 1);

...
Qcommon_Frame (time);

oldtime = newtime;
}
我对上面的代码有一些疑问:
1.) GetMessage 的行是什么功能:
if (!GetMessage (&msg, NULL, 0, 0))
Com_Quit ();
不应该只是
if (msg.message == WM_QUIT)
Com_Quit ();
???
2.) 为什么我们要等 1 m。秒
do
{
newtime = Sys_Milliseconds ();
time = newtime - oldtime;
} while (time < 1);
?
谢谢帮助和建议。

最佳答案

  • 正如评论中指出的,检查 !GetMessage相当于检查 msg.msg==WM_QUIT
  • 该时间检查以毫秒为单位,而不是秒。如果任何代码尝试基于除以时间来归一化一个点,则可能会出现除以零错误。如果游戏作为没有图形的专用服务器运行,或者关闭了垂直同步,则很容易发生这种情况。您可以说游戏的上限为 1000 帧/秒。
  • 关于c++ - Quake 2 中的 Windows 消息循环实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63540451/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com