c++ - 基于时间的循环和基于帧的循环

标签 c++

尝试理解在游戏循环中设置恒定速度的概念。我头疼。我读了deWiTTERS page ,但我看不出为什么/如何......当我得到它时......它滑落了。

while(true)
{
      player->update() ;
      player->draw() ;
}

这将尽可能快地运行,具体取决于处理器的速度……我明白了。

要在所有计算机上以相同的速度运行,逻辑是我不明白的。如果我试图以 60fps 的速度运行,那么这意味着对象每 16 毫秒移动一帧,是吗?我不明白的是 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 时,我知道他递增到下一个 16 毫秒间隔。但是我也不明白这部分:

sleep_time = nextgametick  - GetTickCount() 

Sleep(sleep_time) 是什么意思?处理器离开循环并做其他事情?它是如何实现运行60fps的?

最佳答案

在 update_game() 和 display_game() 函数完成的时间少于 60 帧的单帧间隔的情况下,循环会尝试确保在该间隔结束之前不处理下一帧,方法是休眠(阻塞线程)关闭多余的帧时间。似乎它试图确保帧速率上限为 60FPS,并且不会更高。

处理器不会“离开循环”,而是阻塞运行循环的线程(阻止继续执行代码),直到 sleep 时间结束。然后它继续到下一帧。在多线程游戏引擎中,像这样休眠主游戏循环的线程让 CPU 有时间在其他线程中执行代码,这些线程可能管理物理、AI、音频混合等,具体取决于设置。

为什么在循环开始之前调用 GetTickCount()? 我们从您代码中的注释得知 GetTickCount() 返回自系统启动以来的毫秒数。

假设当您启动程序时系统已经运行了 30 秒(30,000 毫秒), 假设我们没有在进入循环之前调用 GetTickCount(), 而是将 next_game_tick 初始化为 0。

我们执行更新和绘制调用(例如,它们需要 6 毫秒),然后:

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 为正时才 sleep , 游戏循环将尽可能快地运行(可能快于 60FPS), 这不是你想要的。

关于c++ - 基于时间的循环和基于帧的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362723/

相关文章:

c++ - 链接到动态文件和作为输入对象有什么区别?

c++ - 分段FTP上传

c++ - 运行时确定 C++ 的类型

c++ - htonl 出现段错误

c++ - 无法发送代理凭据 (407)

c++ - clang 没有看到通过 typedef 引入的基类构造函数

c++ - 如何访问 std::array 给定其在 C++ 中的指针的元素

c++ - 在线判断平台中的全局数组堆内存分配

c++ - 如何跨多个文件使用命名空间

c++ - 从文本文件中获取指令