c – 基于时间的循环和基于帧的循环

c – 基于时间的循环和基于帧的循环,第1张

概述试图理解在游戏循环中设定恒定速度的概念.我头疼.我读了 deWiTTERS page,但我看不到为什么/如何…当我得到它…它滑倒. while(true){ player->update() ; player->draw() ;} 这将尽可能快地运行,取决于处理器的速度是多少…我得到了 在所有计算机上以相同的速度运行,逻辑是我没有得到的.如果我试图运行在60fps,那么 试图理解在游戏循环中设定恒定速度的概念.我头疼.我读了 deWiTTERS page,但我看不到为什么/如何…当我得到它…它滑倒.
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 startedint 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_time)是什么意思?处理器离开循环并执行其他 *** 作?它如何实现运行60fps?

解决方法 如果update_game()和display_game()函数在60FPs的时间内比单个帧间隔更短的时间内完成,循环将尝试确保下一个帧不会被处理,直到该时间间隔为止,通过睡眠(阻塞线程)关闭多余的帧时间.似乎像是试图确保帧速率上限为60FPS,而不是更高.

处理器不会“离开循环”,而是循环运行的线程被阻止(阻止继续执行代码),直到睡眠时间过长.然后它继续到下一帧.在多线程游戏引擎中,睡眠主游戏循环的线程使得cpu可以在其他线程中执行代码,这可能是管理物理,AI,音频混合等,具体取决于设置.

为什么在循环开始之前调用GetTickCount()
我们从代码中的注释中知道GetTickCount()从系统启动后返回毫秒.

所以说,当你启动你的程序时,系统运行了30秒(30,000ms)
我们假设在进入循环之前没有调用GetTickCount()
而是将next_game_tick初始化为0.

我们进行更新并绘制调用(例如,它们需要6ms),然后:

next_game_tick += SKIP_TICKS;  // next_game_tick is Now 16sleep_time = next_game_tick - GetTickCount();   // GetTickCount() returns 30000!// So sleep_time is Now 16 - 30000 = -29984 !!!

由于我们(明智地)睡眠时sleep_time为正,游戏循环将尽可能快地运行(可能比60FPS快),这不是你想要的.

总结

以上是内存溢出为你收集整理的c – 基于时间的循环和基于帧的循环全部内容,希望文章能够帮你解决c – 基于时间的循环和基于帧的循环所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存