我正在开发一个游戏,其中每个对象都有自己的线程,它们在线程中移动和执行操作。
我得到了一个中心对象,它协调所有对象之间的所有交互。我遇到过许多随机对象在随机时间做随机事情的问题,我不能重现这些问题,它们发生在大约100次运行中的1次。我甚至遇到了不可能的事情发生的情况--在程序的中间写了一个字段,其中唯一要写的语句是在程序的开头。
我可以遵循什么准则来修复这个问题,而不是通过在每次遍历时锁定中心对象来讨好所有线程。我不想贬低他们,因为这会引起“手风琴”运动。当对象1,2,3,4,5需要向右移动时,引用手风琴运动就会发生(时间向下移动)。
54321
5432 1
543 21
54 321
5 4321
54321编辑:只是澄清一下:
我使用一个框架,我认为每个对象都有一个线程,我不能控制它。所有的对象都被称为它们的更新函数,在多线程代码中出现一些错误后,我发现它是并行执行的。它可能会合并线程或为每个线程分配许多对象进行更新,但我不能确定,除非您能向我展示如何在科学方法中解决这一问题。
发布于 2011-05-03 18:44:50
首先。使用几百个线程会使你的程序变慢。使用数千个线程实在是太可怕了。你真的应该重新考虑你的应用程序设计。ThreadPool可能更合适?
这里有一篇很棒的文章解释了所有的线程概念:http://msdn.microsoft.com/en-us/magazine/cc163744.aspx
正如我在评论中所说的,我使用了一个自动生成线程的框架,我无法控制它
井。那么您一定是不正确地使用了框架。任何游戏框架开发人员都不可能在每个设计中创建数百个线程。
发布于 2011-05-03 18:18:06
主要:不要不必要地使用多线程,因为并行性是困难的,正如你开始发现的那样(看看例如race conditions)。如果您认为线程解决了问题,请使用线程工作池来根据处理器/核心的数量进行扩展,而不是根据您的问题大小(对象的数量)进行扩展。
在您的特定情况下:从渲染中隔离物理和对象交互。我猜想你可以在一个扫描(和在一个线程中)完成所有的对象更改,然后渲染它们,避免任何手风琴(!)。
https://stackoverflow.com/questions/5868026
复制相似问题