更新; -changing j = 0 to j = i允許多達700個具有平滑幀速率的粒子2D粒子引擎無法處理超過450個粒子。爲什麼? (XNA)
我試圖用數百個具有Vector2s的粒子聲明其位置和Vector2的速度來模擬2D水。
談到碰撞檢測,我的程序不喜歡有超過450個粒子,儘管只使用了畢達哥拉斯定理。
這裏是主類中的碰撞檢測;
for (int i = 0; i < particleList.Count; i++)
{
for (int j = 0; j < particleList.Count; j++)
{
if (distanceBetween(particleList[i].position, particleList[j].position) < reactDistance)
{
if (particleList[i].position.X > particleList[j].position.X) //x axis
{
particleList[i].velocity.X += repelSpeed;
particleList[j].velocity.X -= repelSpeed;
particleList[i].position.X -= attractSpeed;
particleList[j].position.X += attractSpeed;
}
else
{
particleList[i].velocity.X -= repelSpeed;
particleList[j].velocity.X += repelSpeed;
particleList[i].position.X += attractSpeed;
particleList[j].position.X -= attractSpeed;
}
if (particleList[i].position.Y > particleList[j].position.Y) //y axis
{
particleList[i].velocity.Y += repelSpeed;
particleList[j].velocity.Y -= repelSpeed;
particleList[i].position.Y -= attractSpeed;
particleList[j].position.Y += attractSpeed;
}
else
{
particleList[i].velocity.Y -= repelSpeed;
particleList[j].velocity.Y += repelSpeed;
particleList[i].position.Y += attractSpeed;
particleList[j].position.Y -= attractSpeed;
}
}
}
}
這裏是distanceBetween(v1,v2)方法;
public float distanceBetween(Vector2 a, Vector2 b)
{
float xDist, yDist, distTo;
if (a.X > b.X) //x axis
{
xDist = a.X - b.X;
}
else
{
xDist = b.X - a.X;
}
if (a.Y > b.Y) //y axis
{
yDist = a.Y - b.Y;
}
else
{
yDist = b.Y - a.Y;
}
distTo = (float)(Math.Sqrt((xDist * xDist) + (yDist * yDist)));
return distTo;
}
Vector2.Distance(v1,v2)不會產生可見的性能變化。
如果你想知道地球上吸引什麼,這是我試圖形成水收集的可憐嘗試。我不知道該怎麼做。
最後,我想是這樣的:http://grantkot.com/MPM/Liquid.html
由於第一個循環粒子已經被檢查不能第二個循環開始爲j = i而不是j = 0? –
哇,你說得對。該程序現在允許多達700個具有平滑幀速率的粒子! – ShadowByte
你也可以嘗試同時做到這一點。 http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.aspx – Lasse