停止一个长时间的方法

时间:2010-08-19 15:54:02

标签: c++

我确定我已经在某个地方看到了这个但却无法记住它在C#中可能存在的地方。

我有一堆游戏对象,每个游戏对象都会被更新。是否有可能破坏更新方法,如果它采取长?

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

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

谢谢,

菲尔。

4 个答案:

答案 0 :(得分:3)

如果您控制更新的界面,您可以将其传递给允许的时间,并让游戏对象自行终止。有点像合作多线程。

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

答案 1 :(得分:2)

是的,你需要线程。

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

编辑:如果这是你自己的代码 - 这可能是最难解决的问题之一。线程是棘手的,控制线程访问,优先级和配额更难。

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

答案 2 :(得分:2)

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

另一种方法是根据时间跨框架传播工作。希望你有一些推进每一帧的程序计时器。

将算法分解成碎片,没有任何单件花费比运行时间长20ms。触发“事件”,开始记录从该事件开始的时间,如果已经过了足够的时间,比如20毫秒,则运行算法的下一部分。这是一个穷人的时间片。 : - )

这是一个关于让你的游戏/模拟使用时间而不是机器周期的网站。

Fix Your Timestep

答案 3 :(得分:0)

真正的问题是为什么更新一些状态会破坏帧率?

这是一个设计问题,但你需要线程,原因如下:

  • 你想要一个恒定的帧率,这意味着一个专门用于显示的线程,大部分工作应该由现在的图形卡完成,但仍然
  • 你想要对输入/输出做出反应,这是另一个线程,事实上大多数IO需要一个专用线程:你可以将键盘+鼠标配对一个,但你需要两个用于网络(一个用于发送,一个用于接收) )
  • 你需要一些线程(至少一个)来进行重度运算:更新状态等......
  • 最后,你可能会有一些线程来统治它们(不是一个环,一个线程),它将负责排队和调度事件

当您考虑它时,它与模型 - 视图 - 控制器模型没有太大区别,您只需为输入/输出添加一些其他组件

通常情况下,这样运行:

  • 用户点击鼠标,鼠标监听器线程会生成一个事件(鼠标点击在此位置)
  • Controller线程接收事件并将其发送到“模型”线程,该线程将更新游戏状态(启动操作等等),如果它是一个长动作,它会更好,如果它是发送到一个专用线程(这是线程池的想法开始的地方)
  • View线程负责显示,并定期更改要显示的缓冲区,它独立于后台运行的计算,但如果您希望它看到一个同步(锁定)状态一致而不是部分更新状态

我想补充说,要做到这一点非常复杂(有几种方法)。如果你添加太多线程,你只会让机器在你的脚下崩溃,有可能出现僵局,活锁,饥饿等......

如果您希望尽快完成某项工作,请获取框架:Ogre是一个很好的开源图形库。除此之外,还有关于游戏编程的资源。