gpt4 book ai didi

language-agnostic - 比无限循环+方 block 更好的游戏循环?

转载 作者:行者123 更新时间:2023-12-02 19:19:03 24 4
gpt4 key购买 nike

每个游戏教程和游戏框架(甚至是相当新的 XNA 框架)都以永无止境的循环开始,该循环具有相当于 DoEvents() 的功能,以防止操作系统锁定。

从非游戏的角度来看,我觉得这种代码闻起来很时髦。
没有更好的选择吗?

--编辑--
很多答案都说每个程序基本上都是一个循环。确实如此,但我觉得循环应该由您的操作系统执行,而不是由您执行。只有操作系统拥有以最佳方式分配资源所需的所有信息。还是我在这里遗漏了重要的一点?

最佳答案

每个 Windows 应用程序的核心都有一个如下所示的循环:

BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )
{
if (bRet == -1 )
{
// handle the error and possibly exit
}
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

确保消息被调度是应用程序的工作,而不是操作系统的工作。

正如您可能知道的,早期的 Windows 游戏使用了另一种方法,即调用 PeekMessage,而不是调用阻塞的 GetMessage 函数,然后调用游戏的如果没有消息要处理,则主处理循环。使用各种形式的延迟来尝试在不占用 100% CPU 的情况下获得足够的帧速率。只是没有足够好的计时器来提供平滑的帧速率。

现在,可能没有必要显式编写调用 DoEvents 的循环。现在可能可以通过使用内置计时器池计时器(在.NET中由System.Threading.Timer公开,并由System.Timers.Timer)。

我记得,及时获取鼠标和键盘事件也存在问题。我们使用直接键盘和鼠标访问,而不是依赖消息循环,因为消息循环通常太慢,有时会导致我们丢失信息。

我已经很多年没有编写游戏了,我不知道 .NET 作为一个游戏平台是什么样的。输入可能仍然是一个问题——消息队列根本不够快,无法提供游戏开发人员想要的闪电般的快速响应。因此他们绕过消息队列来执行关键任务。

关于language-agnostic - 比无限循环+方 block 更好的游戏循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680921/

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