基于时间的循环和基于帧的循环
Time based loop and Frame based loop
试图理解在游戏循环中设置恒定速度的概念。我头疼。我读了deWiTTERS的页面,但我看不出为什么/如何……等我拿到了……它滑落。
while(true)
{
player->update() ;
player->draw() ;
}
这将运行得尽可能快,这取决于处理器有多快…我明白了。
要在所有计算机上以相同的速度运行,逻辑是我不明白的。如果我想以60fps的速度运行,那就意味着每16ms物体移动一帧,对吧?我不明白的是为什么update()
或draw()
可能太慢了。
deWiTTERS示例(我使用60):
const int FRAMES_PER_SECOND = 60;
const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
int sleep_time = 0;
bool game_is_running = true;
while( game_is_running ) {
update_game();
display_game();
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - GetTickCount();
if( sleep_time >= 0 ) {
Sleep( sleep_time );
}
else {
// Shit, we are running behind!
}
}
我不明白为什么他在循环开始之前就得到了当前时间。当他增加SKIP_TICKS
时,我理解他增加到下一个16ms间隔。但是我不太明白这部分:
sleep_time = nextgametick - GetTickCount()
Sleep(sleep_time)
是什么意思?处理器离开循环去做别的事情?它是如何实现60fps的?
如果update_game()和display_game()函数以60FPs的速度在少于一个帧间隔的时间内完成,循环将通过休眠(阻塞线程)多余的帧时间来确保下一帧不被处理,直到该间隔结束。似乎它试图确保帧率上限为60FPS,而不是更高。
处理器并没有"离开循环",而是你的循环正在运行的线程被阻塞(阻止继续执行你的代码),直到睡眠时间结束。然后继续到下一帧。在多线程游戏引擎中,像这样休眠主游戏循环的线程可以让CPU有时间执行其他线程中的代码,这可能是管理物理,AI,音频混合等,这取决于设置。
为什么在循环开始之前调用GetTickCount() ?我们从代码中的注释中知道GetTickCount()返回系统启动后的毫秒数。
那么,假设当你启动程序时,系统已经运行了30秒(30,000毫秒),假设在进入循环之前没有调用GetTickCount(),但是将next_game_tick初始化为0。
我们执行更新和绘制调用(作为一个例子,它们需要6ms),然后:
next_game_tick += SKIP_TICKS; // next_game_tick is now 16
sleep_time = next_game_tick - GetTickCount();
// GetTickCount() returns 30000!
// So sleep_time is now 16 - 30000 = -29984 !!!
因为我们(理智地)只在sleep_time为正值时睡觉,游戏循环将尽可能快地运行(可能快于60FPS),这不是你想要的。
- OpenCV QT,显示视频的帧(不使用while循环)
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- 将函数应用于特征矩阵中的所有元素,而无需循环
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 为什么 OpenCL 嵌套循环仅适用于某些元素
- 如果 a 具有相同的值,a->b 如何依赖于选定的堆栈帧?
- Openmp-嵌套用于循环
- 有类似于循环(圆形)迭代器的东西吗?
- 我是否必须求助于循环,以比较C 中的两个2D阵列
- 对于作用于整数向量的循环行为异常
- 我可以告诉 nvcc 将 #pragma 展开应用于函数中的所有循环吗?
- 在现代C++中,有没有类似于python中基于范围的“enumerate”循环
- 此循环仅适用于第一次迭代
- "继续"使用标志作用于哪个循环?
- 嵌套用于数字沿列向下的循环
- 游戏循环帧速率控制问题
- 在循环中使用av_read_frame缓存AVFrames只获得最后几帧
- 嵌套用于未产生所需结果的循环
- C++嵌套用于循环
- C++嵌套用于循环-内积-marix乘法