우주 탐사 게임을 만들고 있는데 현재 중력에 대한 작업을 시작했습니다 (C #에서 XNA 사용).
중력은 여전히 조정이 필요하지만 그렇게하려면 물리 계산에서 일부 성능 문제를 해결해야합니다.
이것은 100 개의 객체를 사용하고 있으며, 일반적으로 물리 계산없이 1000 개의 객체를 렌더링하는 것은 300 FPS (내 FPS 캡)를 훨씬 초과하지만 10 개 이상의 객체는 게임 (및 실행되는 단일 스레드)을 물리 계산을 할 때 무릎.
나는 스레드 사용을 확인했고 첫 번째 스레드는 모든 작업에서 스스로를 죽이고 있었으므로 다른 스레드에서 물리 계산을 수행해야한다고 생각했습니다. 그러나 다른 스레드에서 Gravity.cs 클래스의 Update 메서드를 실행하려고 할 때 Gravity의 Update 메서드에 아무 것도 없어도 게임은 여전히 2 FPS로 떨어집니다.
Gravity.cs
public void Update()
{
foreach (KeyValuePair<string, Entity> e in entityEngine.Entities)
{
Vector2 Force = new Vector2();
foreach (KeyValuePair<string, Entity> e2 in entityEngine.Entities)
{
if (e2.Key != e.Key)
{
float distance = Vector2.Distance(entityEngine.Entities[e.Key].Position, entityEngine.Entities[e2.Key].Position);
if (distance > (entityEngine.Entities[e.Key].Texture.Width / 2 + entityEngine.Entities[e2.Key].Texture.Width / 2))
{
double angle = Math.Atan2(entityEngine.Entities[e2.Key].Position.Y - entityEngine.Entities[e.Key].Position.Y, entityEngine.Entities[e2.Key].Position.X - entityEngine.Entities[e.Key].Position.X);
float mult = 0.1f *
(entityEngine.Entities[e.Key].Mass * entityEngine.Entities[e2.Key].Mass) / distance * distance;
Vector2 VecForce = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
VecForce.Normalize();
Force = Vector2.Add(Force, VecForce * mult);
}
}
}
entityEngine.Entities[e.Key].Position += Force;
}
}
그래, 알아 중첩 된 foreach 루프이지만 중력 계산을 수행하는 다른 방법을 모르겠습니다. 이것이 효과가있는 것 같습니다. 너무 집중적이므로 자체 스레드가 필요합니다. (누군가이 계산을 수행하는 매우 효율적인 방법을 알고 있더라도 대신 여러 스레드에서 수행하는 방법을 알고 싶습니다.)
EntityEngine.cs (Gravity.cs 인스턴스 관리)
public class EntityEngine
{
public Dictionary<string, Entity> Entities = new Dictionary<string, Entity>();
public Gravity gravity;
private Thread T;
public EntityEngine()
{
gravity = new Gravity(this);
}
public void Update()
{
foreach (KeyValuePair<string, Entity> e in Entities)
{
Entities[e.Key].Update();
}
T = new Thread(new ThreadStart(gravity.Update));
T.IsBackground = true;
T.Start();
}
}
EntityEngine은 Game1.cs에서 만들어지며 Update () 메서드는 Game1.cs에서 호출됩니다.
게임이 업데이트 될 때마다 별도의 스레드에서 실행되도록 Gravity.cs에서 물리 계산이 필요하므로 계산으로 인해 게임이 엄청나게 낮은 (0-2) FPS로 느려지지 않습니다.
이 스레딩 작업을 어떻게 수행합니까? (누구나 가지고 있다면 개선 된 행성 중력 시스템에 대한 제안은 환영합니다)
또한 스레딩을 사용하지 않아야하거나 잘못 사용할 위험에 대한 교훈을 찾고 있지 않습니다. 어떻게 해야하는지에 대한 정답을 찾고 있습니다. 나는 이미 이해하거나 도움이되는 작은 결과 로이 질문에 인터넷 검색을 한 시간을 보냈습니다. 나는 무례한 것을 의미하지는 않지만, 항상 의미있는 정답을 얻기위한 프로그래밍 멍청한 놈처럼 어려운 것 같습니다. 나는 보통 너무 복잡한 답변을 얻습니다. 누군가 내가하고 싶은 일을해서는 안되는 이유를 말하고 대안을 제공하지 않습니다 (유용한).
도와 주셔서 감사합니다!
편집 : 내가 얻은 답변을 읽은 후에 실제로 여러분이 관심을 가지고 있으며 효과가있는 답변을 내놓으려는 것이 아니라는 것을 알았습니다. 나는 하나의 돌로 두 마리의 새를 죽이고 싶었지만 (성능 향상 및 multlthreading의 기본 사항 배우기) 대부분의 문제는 내 계산에 있으며 스레딩은 성능 향상에 가치가있는 것보다 훨씬 번거 롭습니다. 모두 감사합니다. 답을 다시 읽고 학교에 다녀 오면 답을 다시 시도하겠습니다. 다시 감사합니다!
k
이 O(n^2)
문제를 크게 줄일 수 있습니다.
sin² + cos² ≡ 1
이미 정규화되었으므로! 관심있는 두 개체를 연결하는 원래 벡터를 사용하여이 벡터를 정규화했을 수 있습니다. 어떤 삼각대도 필요하지 않습니다.