크기와 속도가 다양한 물체가 서로를 향해 끌고 있습니다. 매번 업데이트 할 때마다 모든 객체를 살펴보고 다른 모든 객체의 중력으로 인한 힘을 더해야합니다. 확장 성이 떨어지고 게임에서 찾은 두 가지 큰 병목 현상 중 하나이며 성능을 개선하기 위해 어떻게해야할지 잘 모르겠습니다.
그것은 느낌이 나는 성능을 향상시킬 수있을 것 같은. 주어진 시간에 시스템의 객체 중 99 %는 객체에 거의 영향을 미치지 않습니다. 물론 물체를 질량별로 정렬 할 수 없으며 질량이 물체보다 거리에 따라 힘이 변하기 때문에 상위 10 개의 가장 큰 물체 만 고려할 수 있습니다 (방정식은의 선을 따릅니다 force = mass1 * mass2 / distance^2
). 나는 가장 큰 물체 와 가장 가까운 물체 를 고려하여 세계의 반대편에있는 수백 개의 작은 바위 조각을 무시하고 아무것도 영향을 미치지 않을 것이라고 생각합니다. 그러나 어떤 물체가 어떤 물체인지 알아 내기 위해 가장 가까운 모든 객체 를 반복해야 하며 위치가 지속적 으로 변경 되고 있습니다.한 번만 할 수있는 것은 아닙니다.
현재 나는 다음과 같은 일을하고있다 :
private void UpdateBodies(List<GravitatingObject> bodies, GameTime gameTime)
{
for (int i = 0; i < bodies.Count; i++)
{
bodies[i].Update(i);
}
}
//...
public virtual void Update(int systemIndex)
{
for (int i = systemIndex + 1; i < system.MassiveBodies.Count; i++)
{
GravitatingObject body = system.MassiveBodies[i];
Vector2 force = Gravity.ForceUnderGravity(body, this);
ForceOfGravity += force;
body.ForceOfGravity += -force;
}
Vector2 acceleration = Motion.Acceleration(ForceOfGravity, Mass);
ForceOfGravity = Vector2.Zero;
Velocity += Motion.Velocity(acceleration, elapsedTime);
Position += Motion.Position(Velocity, elapsedTime);
}
(충돌 테스트와 같이 많은 코드를 제거 했으므로 충돌을 감지하기 위해 객체를 두 번 반복하지 않습니다).
그래서 나는 항상 전체 목록을 반복하는 것은 아닙니다. 첫 번째 객체에 대해서만하고, 객체가 다른 객체에 대해 느끼는 힘을 찾을 때마다 다른 객체가 같은 힘을 느낍니다. 그런 다음 나머지 업데이트를 위해 첫 번째 개체를 다시 고려할 필요가 없습니다.
Gravity.ForceUnderGravity(...)
과 Motion.Velocity(...)
등 기능은 XNA의 벡터 수학 내장의 비트를 사용합니다.
두 물체가 충돌하면 대량의 파편이 생깁니다. 별도의 목록에 보관되며 속도 계산의 일부로 거대한 물체는 파편을 반복하지 않지만 각 파편은 거대한 입자를 반복해야합니다.
이것은 놀라운 한계까지 확장 할 필요가 없습니다. 세계는 무제한이 아니며, 국경을 넘어서 교차하는 물체를 파괴합니다. 아마도 수천 가지 정도의 물체를 처리 할 수 있기를 원합니다. 현재 게임은 약 200 대 초크를 시작합니다.
내가 어떻게 이것을 향상시킬 수 있을지에 대한 생각? 루프 길이를 수백에서 수백으로 줄이는 데 사용할 수있는 휴리스틱? 일부 코드는 모든 업데이트보다 덜 자주 실행할 수 있습니까? 알맞은 크기의 세계를 허용 할만큼 빠를 때까지 멀티 스레드를해야합니까? 속도 계산을 GPU로 오프로드해야합니까? 그렇다면 어떻게 설계해야합니까? 정적 공유 데이터를 GPU에 유지할 수 있습니까? GPU에서 HLSL 함수를 생성하여 임의로 (XNA를 사용하여) 호출하거나 드로우 프로세스의 일부 여야합니까?
G * m1 * m2 / r^2
입니다. 단지 G가 동작을 조정하는 것입니다. (사용자가 시스템을 방해 할 수 있기 때문에 경로