c++ - 设计游戏循环
问题描述
我正在开发一个简单的 Win 游戏。这是我的 2 个类似的游戏循环实现(在 C++ 中):
方法#1:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else {
// Do update, rendering and all the real game loop stuff
}
}
方法#2:
while (Msg.message != WM_QUIT) {
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
// Do update, rendering and all the real game loop stuff
}}
我的问题是哪个更好,我应该选择哪个?是像 #1 方法那样在 else 闭包中进行更新和渲染内容,还是while
像在 #2 方法中那样仅在循环块中进行更新和渲染?
解决方案
答案完全取决于用例。
在您的第一种方法中,您在更新游戏状态之前处理队列中的任何消息。这可能会使您免于一些更新,这些更新是由较新的消息过时的旧消息引起的。
但是,在负载很重的队列上,这可能会导致您的应用程序反应不佳甚至冻结。
第二种方法通过始终更新游戏状态来避免这种情况。
第一种方法可能会变得更健壮,例如在强制执行更新之前只允许处理最大数量的消息。
推荐阅读
- php - 选择设定标准值
- graph-databases - 查询返回错误值
- mysql - 表上的左连接。*作为别名?
- logstash - logstash 用日志文件时间戳替换 @timestamp
- textarea - 阅读
- python - 计算数据框python上列中的特定字符串
- asp.net-mvc - 在 Azure Gov App Service 中发布后 SignalR 功能不起作用
- reactjs - 如何在 React 中“抛出”我自己的“onChange”事件?
- angular - 使用 Protractor 和 Selenium 框架(如 Serenity)有什么好处吗?
- c# - HttpResponseMessage - 从 API 调用解压缩 Gzip 响应会引发以下异常g - 响应过早结束