ОБНОВЛЕНИЯ; - изменение j=0 на j=i позволило использовать до 700 частиц с плавной частотой кадров
Я пытаюсь смоделировать 2D-воду с сотнями частиц, у которых есть Vector2, объявляющие их положение, и Vector2 для их скорости.
Когда дело доходит до обнаружения столкновений, моей программе не нравится иметь более 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
Parallel.For
беретstart, end, loop
. эквивалентный циклfor
будет:for(int i = start; i < N; i++) { loop(i); }
. Преимущество в том, чтоParallel.For
может выполнятьloop
в нескольких потоках вместо одного, что ускоряет процесс. - person Femaref   schedule 02.11.2013