我正在创建一个物理模拟,这意味着它是真实的,我让它正常工作,但帧率下降得很快。
我正在遍历每个对象,然后再遍历每个对象。
我不确定为什么会这样,因为每帧中的操作数保持不变。我唯一能想到的是线程是问题所在。我将迭代分为四个部分,并且我有四分之一的列表是在 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
不是实现我想要的效果的好方法,即在线程之间同时遍历列表。