XNA C#多线程导致ArgumentOutOfRange异常
我想利用多线程,这样我可以在模拟中有更多的粒子XNA C#多线程导致ArgumentOutOfRange异常,c#,multithreading,xna,C#,Multithreading,Xna,我想利用多线程,这样我可以在模拟中有更多的粒子 public List<droplet> droplets = new List<droplet>(); private void collide(int indexOfA, int indexOfB) { // collision code that only changes the position of droplet A and B } public List=new List(); 私有无效碰撞(int
public List<droplet> droplets = new List<droplet>();
private void collide(int indexOfA, int indexOfB)
{
// collision code that only changes the position of droplet A and B
}
public List=new List();
私有无效碰撞(int indexOfA,int indexOfB)
{
//仅改变液滴A和B位置的碰撞代码
}
在更新方法中
if (droplets.Count > 1)
{
for (int i = 0; i < droplets.Count; i++)
{
for (int j = i; j < droplets.Count; j++)
{
Thread t = new Thread(() => collideParticles(i, j));
t.Start();
}
}
}
if(drops.Count>1)
{
对于(int i=0;i碰撞粒子(i,j));
t、 Start();
}
}
}
i立即超出范围,并且在异常发生时通常为1或2
我做错了什么,我该如何解决
编辑:对于那些对collide方法的作用感到好奇的人,请参见下文
if (droplets[i].collisionRectangle.Intersects(droplets[j].collisionRectangle))
{
if (distanceBetween(droplets[i].position, droplets[j].position) < reactDistance * reactDistance)
{
Vector2 sumVector = droplets[i].velocity + droplets[j].velocity;
Vector2 resultVector = sumVector / 2;
droplets[i].velocity = resultVector;
droplets[j].velocity = resultVector;
if (droplets[i].position.X > droplets[j].position.X) //x axis
{
droplets[i].velocity.X += repelSpeed;
droplets[j].velocity.X -= repelSpeed;
droplets[i].position.X -= -repelSpeed;
droplets[j].position.X += -repelSpeed;
}
else
{
droplets[i].velocity.X -= repelSpeed;
droplets[j].velocity.X += repelSpeed;
droplets[i].position.X += -repelSpeed;
droplets[j].position.X -= -repelSpeed;
}
if (droplets[i].position.Y > droplets[j].position.Y) //y axis
{
droplets[i].velocity.Y += repelSpeed;
droplets[j].velocity.Y -= repelSpeed;
droplets[i].position.Y -= -repelSpeed;
droplets[j].position.Y += -repelSpeed;
}
else
{
droplets[i].velocity.Y -= repelSpeed;
droplets[j].velocity.Y += repelSpeed;
droplets[i].position.Y += -repelSpeed;
droplets[j].position.Y -= -repelSpeed;
}
}
}
if(液滴[i].碰撞矩形.相交(液滴[j].碰撞矩形))
{
if(液滴之间的距离[i]。位置,液滴[j]。位置)液滴[j].position.X)//X轴
{
液滴[i].速度.X+=重复速度;
液滴[j].速度.X-=重复速度;
液滴[i].位置.X-=-重复速度;
液滴[j].位置.X+=-重复速度;
}
其他的
{
液滴[i].速度.X-=重复速度;
液滴[j].速度.X+=重复速度;
液滴[i].位置.X+=-重复速度;
液滴[j].位置.X-=-重复速度;
}
if(液滴[i].position.Y>液滴[j].position.Y)//Y轴
{
液滴[i].速度.Y+=重复速度;
液滴[j].速度.Y-=重复速度;
液滴[i].位置.Y-=-重复速度;
液滴[j].位置.Y+=-重复速度;
}
其他的
{
液滴[i].速度.Y-=重复速度;
液滴[j].速度.Y+=重复速度;
液滴[i].位置.Y+=-重复速度;
液滴[j].位置.Y-=-重复速度;
}
}
}
是的,太乱了。我可以推荐您使用线程池来处理这类事情吗?分配一个线程并不便宜,而且在渲染时很可能是在一个内部循环中进行的(哎哟!) 我在这里看到的真正问题是,这里存在着记忆障碍,这意味着I&j的价值在所有意图和目的中都是不确定的。将碰撞粒子更改为打印功能:
static void collideParticles(int i, int j)
{
Console.WriteLine("i = {0}, j = {1}", i, j);
}
我得到了以下结果:
i = 1, j = 3
i = 2, j = 3
i = 3, j = 3
i = 2, j = 3
i = 2, j = 3
i = 2, j = 3
将线程繁殖移动到碰撞粒子中会得到“预期”结果
看不出有什么不对劲。它似乎来自你的
碰撞粒子方法。你们能展示一下它的实现吗?添加到问题的底部。你们在避免多线程时有相同的行为吗?您尝试过调试它吗?使用多线程:超出范围异常。没有多线程和调用“collide”方法:可以工作,但帧速率低。没有多线程和冲突的代码是内部更新方法:工作正常,帧速率平滑。看起来问题是多线程。可能是因为在更新/删除某些水滴(稍后在代码中)时某些线程仍在运行?不管怎样,你知道它是从哪里来的。下一步:找出原因(和/或替代方案)这是不好的。电话的顺序不是问题。同一液滴上的并发性是相同的。那么我的问题有解决方案吗?如何有效地处理数百个粒子之间的碰撞?
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 1
i = 1, j = 2
i = 2, j = 2