如何在SFML游戏中定义CPU使用量?

4

我制作了一个游戏,但不确定游戏在其他设备上是否能以相同方式工作。例如,如果电脑的CPU速度很快,玩家和敌人会移动得更快吗?如果是这样,请问是否有一种方法来定义SFML中可用的CPU使用情况呢?在我的程序中,玩家和敌人移动的方式是: 1-检查按键是否被按下 2-如果是:执行move(x,y)函数;或者,是否有一种方法让CPU在move函数中执行一些操作呢? 谢谢!


2
帧无关运动。我建议阅读这个链接(http://lazyfoo.net/SDL_tutorials/lesson32/index.php),虽然它是关于SDL的,但你会明白正在发生什么。 - PcAF
谢谢提供链接! - QApps
1个回答

5
看起来你担心游戏的物理效果会受到游戏帧率的影响。你的直觉很正确!这是一个重大问题,如果想让游戏更专业,你需要解决它。
根据Glenn Fiedler在他的Gaffer on Games文章'Fix Your Timestep!'中所说:

[处理时间不当的游戏循环可能使] 物理模拟的行为取决于传入的增量时间。这可能会导致游戏的“感觉”因帧率略有不同,也可能极端到弹簧模拟爆炸到无穷大、快速移动的对象穿过墙壁以及玩家掉进地面!

逻辑上讲,你必须将更新与绘制一帧所需的时间分离开来。一个简单的解决方案是:
  • 选择一个可以安全处理的时间量(你的时间步长)
  • 将每帧经过的时间添加到累积的时间池中
  • 以安全块的方式处理经过的时间

伪代码如下:

time_pool = 0;
timestep = 0.01; //or whatever is safe for you!
old_time = get_current_time();

while (!closed) {
    new_time = get_current_time();
    time_pool += new_time - old_time;
    old_time = new_time;

    handle_input();
    while (time_pool > timestep)
    {
        consume_time(timestep); //update your gamestate
        time_pool -= timestep;
    }
    //note: leftover time is not lost, and will be left in time_pool
    render();
}

值得注意的是,这种方法有它自己的问题:未来的帧必须消耗由调用consume_time产生的时间。如果对consume_time的调用时间过长,则产生的时间可能需要在下一帧进行两次调用 - 然后是四次 - 然后是八次 - 依此类推。如果您使用此方法,您将需要确保consume_time非常高效,即使如此,最好还是有备用计划。
如果您想更全面地了解,请阅读链接的文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接