【发布时间】:2012-11-08 03:28:22
【问题描述】:
我正在创建一个物理模拟,该模拟是真实的,我让它正常工作,但帧率下降得很快。
我正在遍历每个对象,然后再遍历每个对象。
我不确定为什么会这样,因为每帧中的操作数保持不变。我唯一能想到的就是线程是问题所在。我将迭代分为四个部分,我有四分之一的列表是在 4 个单独的线程上计算的,但是当我检查任务管理器时,我实际上只使用了一个内核。
下面是相关代码:
private void Update(GameTime gameTime)
{
for (int i = 0; i < Bodies.Count; i++)
{
Bodies[i].Update(gameTime);
}
ThreadPool.QueueUserWorkItem(new WaitCallback(CalculatePhysics0));
ThreadPool.QueueUserWorkItem(new WaitCallback(CalculatePhysics1));
ThreadPool.QueueUserWorkItem(new WaitCallback(CalculatePhysics2));
ThreadPool.QueueUserWorkItem(new WaitCallback(CalculatePhysics3));
}
private void CalculatePhysics0(object o)
{
for (int i = 0; i < Bodies.Count/4; i++)
{
Body body = Bodies[i];
g.ApplyTo(ref body, Bodies);
}
}
// 3 other methods exactly the same, but iterating their portion of the list
我对多线程不是很有经验。不过,我可以处理因使用它而产生的问题。我可以看到问题可能是ThreadPool不是达到我想要的效果的好方法,即在线程之间并发遍历列表。
【问题讨论】:
-
我不认为它是相关的,但我使用的是 xna GS 4.0
-
谢谢,这非常相关,因为我的答案仅在 4.0+ 中可用。
-
与您的实际问题无关,但 QueueUserWorkItem 有第二个参数,可让您在“object o”参数中将值传递给函数。这可以让您避免重复的函数,而使用单个代码。
-
@JasonMalinowski 是的,我曾考虑过这样做,但我首先想确保我的方法是准确的。
标签: c# multithreading concurrency xna threadpool