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_time)是什么意思?处理器离开循环并执行其他操作?它如何实现运行60fps?
解决方法
处理器不会“离开循环”,而是循环运行的线程被阻止(阻止继续执行代码),直到睡眠时间过长.然后它继续到下一帧.在多线程游戏引擎中,睡眠主游戏循环的线程使得cpu可以在其他线程中执行代码,这可能是管理物理,AI,音频混合等,具体取决于设置.
为什么在循环开始之前调用GetTickCount()
我们从代码中的注释中知道GetTickCount()从系统启动后返回毫秒.
所以说,当你启动你的程序时,系统运行了30秒(30,000ms)
我们假设在进入循环之前没有调用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快),这不是你想要的.
原文地址:https://www.jb51.cc/c/112372.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。