我确定我已经在某个地方看到了这个但却无法记住它在C#中可能存在的地方。
我有一堆游戏对象,每个游戏对象都会被更新。是否有可能破坏更新方法,如果它采取长?
例如,如果程序员在1个更新周期中添加了一堆需要更长时间的代码,我可以终止其更新(更新时),以便游戏的帧速率保持不变吗?
我猜这可能与线程有关,但我不确定。
谢谢,
菲尔。
答案 0 :(得分:3)
如果您控制更新的界面,您可以将其传递给允许的时间,并让游戏对象自行终止。有点像合作多线程。
如果您有很多对象,这可能是您最好的选择,因为您减少了真实线程的开销。
答案 1 :(得分:2)
是的,你需要线程。
您可能希望查看您的游戏库是否支持自己的线程模型,而不是原始pthread(或特定于平台的等效项)
编辑:如果这是你自己的代码 - 这可能是最难解决的问题之一。线程是棘手的,控制线程访问,优先级和配额更难。
通常杀死线程是一个坏主意,清理代码总是很棘手。最简单的方法是在工作线程的循环中有一个标志,在每次迭代时检查它。然后控制器线程可以将其设置为“die”,如果它已超限并且线程将退出。关闭死锁的线程更难。
答案 2 :(得分:2)
线程是将工作分解为独立工作单位的常用方法。
另一种方法是根据时间跨框架传播工作。希望你有一些推进每一帧的程序计时器。
将算法分解成碎片,没有任何单件花费比运行时间长20ms。触发“事件”,开始记录从该事件开始的时间,如果已经过了足够的时间,比如20毫秒,则运行算法的下一部分。这是一个穷人的时间片。 : - )
这是一个关于让你的游戏/模拟使用时间而不是机器周期的网站。
答案 3 :(得分:0)
真正的问题是为什么更新一些状态会破坏帧率?
这是一个设计问题,但你需要线程,原因如下:
当您考虑它时,它与模型 - 视图 - 控制器模型没有太大区别,您只需为输入/输出添加一些其他组件
通常情况下,这样运行:
我想补充说,要做到这一点非常复杂(有几种方法)。如果你添加太多线程,你只会让机器在你的脚下崩溃,有可能出现僵局,活锁,饥饿等......
如果您希望尽快完成某项工作,请获取框架:Ogre是一个很好的开源图形库。除此之外,还有关于游戏编程的资源。