在基于回合(RPG)的游戏中使用空闲时间进行更新


9

如果您使用任何基于回合的RPG游戏,那么很长一段时间内什么都不会发生,因为该游戏在“ wait_for_player_input”上循环播放。当然,利用这段时间来更新事物似乎是明智的。

但是,这立即表明它需要进行线程化。在单线程中可以进行这种设计吗?

loop:  
if not check_something_pressed:  
    update_a_very_small_amount  
else  
  keep going

但是,如果我们说“ a_very_small_amount”仅在每个循环中更新单个对象,则更新将非常缓慢。

您将如何处理此问题,最好是在单个线程中进行?

编辑:我已经将此语言标记为不可知论者,因为这似乎是明智的选择,尽管任何更特定于Python的东西都将是不错的选择。;-)

第二次编辑:该游戏不打算使用任何动画组件;也就是说,我目前正在将其作为等待玩家输入运行,然后更新所有内容并进行绘制。因此,它不是X FPS,而是取决于用户的速度。

Answers:


7

是的,它可以在单个线程中完成。一般来说,您将希望每帧更新对象,而不仅仅是在有空闲周期时更新。您的动画和动作将与帧速率断开连接,如果不这样做,则看起来会显得比较不稳定。如果您在谈论有关AI更新的更多信息或不需要实时的其他信息,我会为其设置一个计时器。您应该知道目标帧速率是多少,并且空闲时间将是完成其他所有操作后剩下的时间。

假设您的游戏目标是60 FPS。剩下的时间为16.667毫秒,可以完成每一帧所需的所有工作。在游戏开始时,使用可用的最高分辨率计时器获取当前时间,向其添加16.667 ms并将其存储在某个位置。我认为python中的函数是time(),尽管自从我从事该语言工作已有一段时间了。处理完成后,进入一个循环,根据您记录的时间检查当前时间。如果当前时间小于帧结束时间,请更新_a_very_small_amount。由于您的小更新应该可以快速处理,因此我不必担心处理会超出框架的结尾。下一帧的开始只会稍有延迟,并且您似乎有足够的空闲时间来处理它。

帧完成处理后,将上一帧末尾的存储时间增加16.667毫秒,以找出下一帧末尾应在的位置。如果您使用当前时间+ 16.667毫秒,并且处理结束,那么最后一帧经过的时间将推下下一帧的末尾。

回复:第二次编辑

为了澄清,我在这里使用术语帧速率来表示主循环中的一次迭代。如果它基于用户的输入速度,那么我想您的目标是简单地使游戏具有响应能力。否则,您每次都可以检查输入并更新整个循环中的所有内容,即使这样做需要10秒钟。为了使它具有响应性,您可能需要检查大约每秒20次的输入,即使您实际上没有绘制这些帧,它也能提供20 FPS的有效帧速率。在您需要再次检查输入之前,这将使您有50毫秒的时间来更新内容。


2

特别是对于Python,您可以尝试使用协程对多个更新调用进行计算。

协程是使子例程通用化的程序组件,以允许多个入口点在某些位置挂起并恢复执行。

PEP-0342详细介绍了Python中的协程实现。

您可以创建自己的调度程序和任务,以模拟单个线程上的多线程。这与Javascript框架允许类似处理的多线程方法相同,即使Javascript在单个进程上运行也是如此。


1

是的,这是可能的。您的游戏将具有某种主游戏循环。像这样:

while(gameRunning)
{
  checkUserInput()
  updateGame()
  renderGame()
}

在updateGame中,您可以遍历游戏对象并“一点”更新它们。如果您使用这种方法进行大量计算,游戏将立即挂起。因此,您需要一种方法来拆分这些计算,以在游戏循环的多次迭代中运行。

如何将它们拆分,取决于您正在构建的游戏类型。假设您有一个路径查找器例程,该例程使用A *来计算通过迷宫的路径。您需要在一定时间后或经过固定的迭代次数后停止算法,将计算出的路径保持到目前为止,然后将控制权返回给游戏循环。下次调用updateGame时,路径查找将继续。您甚至可以在仍在计算字符时沿局部路径移动字符。

大多数时候,您无需担心updateGame调用花费的时间太长。

“过早的优化是万恶之源!”
如果您确实遇到了更新例程中的性能瓶颈,那么该是时候进行调查和优化了。由于您无法事先知道游戏的哪些部分将花费最多的时间进行计算,并且可能会浪费时间来优化错误的内容。


1

我理解您的问题的方式是,基本上您是在问协作多任务处理。

基本的基础结构将是功能指针的列表,所有功能指针都以循环方式调用(除非需要更复杂的优先级排序),并且所有这些功能都将“做一点工作”,足够小以至于不会导致游戏变得迟钝。我是在DOS线程变热之前在DOS中完成此操作的,在不支持线程化的移动设备上也是如此。

我认为,更好的问题是在等待玩家移动时该怎么做。什么样的事情会占用大量处理器,因此无论如何都无法即时执行,而同时又是如此可选,以至于玩家只要足够快地敲击一些移动键,游戏就不会是时候处理这​​些了。因此,诸如为几千个AI计算A *的事情就不存在了。

我认为,更好的解决方案是简单地让计算机休眠/休眠,然后让计算机的电源管理工作。笔记本电脑用户会更喜欢您。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.