【问题标题】:Creating an update method with custom rate processing in c++在 C++ 中使用自定义速率处理创建更新方法
【发布时间】:2015-06-17 08:54:22
【问题描述】:
如果您曾经使用过 XNA 游戏工作室 4,那么您对更新方法很熟悉。默认情况下,其中的代码每秒处理 60 次。我一直在努力在 C++ 中重新创建这样的效果。
我想创建一个方法,它每秒只处理 x 次代码。就像循环一样,我尝试过的每一种方式都会一次处理。我尝试过for 循环、while、goto,并且所有内容都同时处理。
如果有人能告诉我如何以及是否可以在 c++ 中实现这样的事情,我将不胜感激。
【问题讨论】:
标签:
c++
visual-c++
visual-studio-2013
xna
【解决方案1】:
以你目前的知识水平,这是我能得到的最具体的:
循环、fors、ifs 和 goto 无法为所欲为,因为我们已不再处于 MS-DOS 时代。
您也不能让代码以精确每秒 60 帧的速度运行。
在 Windows 上,系统应用程序在称为“事件循环”的东西中运行。
通常,在事件循环中,大多数 GUI 框架调用“onIdle”事件,当应用程序什么都不做时发生。
您从 onIdle 事件中调用更新。
您的 onIdle() 函数将如下所示:
void onIdle(){
currentFrameTime = getCurrentFrameTime();
if ((currentFrameTime - lastFrameTime) < minUpdateDelay){
sleepForSmallAmountOfTime();//using Sleep or anything.
//Delay should be much smaller than minUPdateDelay.
//Doing this will reduce CPU load.
return;
}
update(currentFrameTime - lastFrameTime);
lastFrameTime = currentFrameTime;
}
您需要编写自己的更新函数,您的更新函数应该花费自上一帧以来经过的时间,并且您需要使用 GetTickCount、QueryPerformanceCounter 或一些类似函数编写 getFrameTime() 函数。
您也可以使用系统计时器,但与 onIdle() 事件相比,这是一个坏主意 - 如果您的应用运行速度太慢。
总之,你的路还很长。
你需要学习一些(最好是跨平台的)GUI框架,学习如何创建窗口,事件循环的概念(今天没有它什么都做不了),然后编写自己的“update() " 并了解多线程编程和系统事件的基本概念。
祝你好运。
【解决方案2】:
既然您熟悉 XNA,那么我假设您也熟悉“输入”和“绘图”。你可以做的是为这 3 个函数分配独立的线程,并有一个计时器来查看它是否有时间运行一个线程。
例如,输入可能会触发绘制,并且绘制和输入都会触发更新方法。
-另一种处理方式是我的消息事件。如果您使用的是 Windows,请查看 Windows 消息循环。通过在操作系统触发的事件上执行,这将使您的输入、更新和绘制事件更容易。