C++ 停止一种需要很长时间的方法

C++ 停止一种需要很长时间的方法,c++,C++,我肯定我在什么地方见过这个,但不记得它在哪里,也不记得它可能在C#中 我有一堆游戏对象,每一个对象都会循环更新。如果更新方法需要很长时间,是否可能中断该方法 例如,如果一个程序员在一个更新周期中添加了一堆需要更长时间才能完成的代码,那么我可以终止它的更新(在更新时),以便游戏的帧速率保持不变吗 我想这可能与线程有关,但我不确定 谢谢 菲尔。是的,你需要线程 与原始pthread(或特定于平台的等效线程)不同,您可能希望查看游戏库是否支持自己的线程模型 编辑:如果是你自己的代码,这可能是最难理解的

我肯定我在什么地方见过这个,但不记得它在哪里,也不记得它可能在C#中

我有一堆游戏对象,每一个对象都会循环更新。如果更新方法需要很长时间,是否可能中断该方法

例如,如果一个程序员在一个更新周期中添加了一堆需要更长时间才能完成的代码,那么我可以终止它的更新(在更新时),以便游戏的帧速率保持不变吗

我想这可能与线程有关,但我不确定

谢谢

菲尔。

是的,你需要线程

与原始pthread(或特定于平台的等效线程)不同,您可能希望查看游戏库是否支持自己的线程模型

编辑:如果是你自己的代码,这可能是最难理解的部分之一。线程处理很棘手,控制线程访问、优先级和配额甚至更难


通常杀死线程是个坏主意,清理代码总是很棘手。最简单的方法是在工作线程的循环中有一个标记,它在每次迭代中都会被检查。然后,如果控制器线程已溢出,则可以将其设置为“die”,线程将退出。关闭死锁线程更难。

如果您控制更新的界面,您可以在允许的时间内通过它,让游戏对象自行终止。有点像协作多线程


如果您有很多对象,这可能是您的最佳选择,因为您可以减少实际线程的开销。

线程是将工作分解为独立工作单元的常用方法

另一种方法是基于时间将工作分布到各个帧。希望您有某种程序计时器,它可以推进每一帧

将算法分解为多个部分,每个部分的运行时间都不会超过20毫秒。触发一个“事件”,开始记录从事件开始的时间,如果已经过了足够的时间,比如20毫秒,那么运行算法的下一部分。这是一个穷人的时间片。:-)

这是一个让你的游戏/模拟使用时间而不是机器循环的网站


真正的问题是为什么更新某些状态会降低帧速率

这是一个设计问题,但出于以下几个原因,您需要线程:

  • 你需要一个恒定的帧速率,这意味着一个专用于显示的线程,现在大部分工作都应该由图形卡完成,但仍然需要
  • 你想对输入/输出做出反应,这是另一个线程,事实上,大多数IO都需要一个专用线程:你可以在一个线程中配对键盘和鼠标,但你需要两个线程来联网(一个用来发送,一个用来接收)
  • 您需要多个线程(至少一个)来完成繁重的工作:更新状态等
  • 最后,您可能会有一些线程来管理它们(不是一个环,一个线程),它将负责排队和分派事件
它与模型-视图-控制器模型没有太大的不同,您只需将一些其他组件添加到模型中以进行输入/输出

通常,运行方式如下:

  • 用户单击鼠标,鼠标侦听器线程生成一个事件(鼠标在该位置单击)
  • 控制器线程接收事件并将其发送到“模型”线程,该线程将更新游戏状态(启动动作等)。如果是长动作,则最好将其发送到专用线程(这就是线程池的概念)
  • 视图线程负责显示,并定期更改要显示的缓冲区,它独立于后台运行的计算,但如果希望它看到一致的状态而不是部分更新的状态,则需要一些同步(锁)
我想补充一点,正确的方法非常复杂(有几种方法)。如果你添加了太多的线程,你的机器就会崩溃,可能会死锁、死锁、饥饿等等


如果您希望很快完成某件事情,请获取一个框架:例如,它是一个很好的开源图形库。有关于游戏编程的资源,否则。

不,它不支持它,这是我自己正在进行的工作。谢谢。在每个游戏周期中创建和终止线程并不是一个好主意。