私は宇宙探査ゲームを構築しており、現在重力に取り組んでいます(XNAを使用したC#で)。
重力はまだ調整が必要ですが、それを行う前に、物理計算でパフォーマンスの問題に対処する必要があります。
これは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に減速させないようにします。
このスレッドを機能させるにはどうすればよいですか?(改善された惑星重力システムに関する提案は、誰かが持っていれば歓迎します)
また、スレッドを使用しない理由や、誤って使用する危険性についてのレッスンも探していません。それを行う方法についての簡単な答えを探しています。私はすでにこの質問をグーグルで1時間費やしましたが、理解したり助けたりした結果はほとんどありませんでした。私は失礼なことをするつもりはありませんが、まっすぐな意味のある答えを得るのは常にプログラミング初心者として難しいようです。通常、私はそれを理解すれば簡単に問題を解決できるほど複雑な答えを得るのが普通です誰かが私がやりたいことをしてはいけない理由を言って、代替手段を提供しません(それは役に立ちます)。
お手伝いありがとう!
編集:私が得た答えを読んだ後、私はあなたたちが実際に気にし、うまくいくかもしれない答えを吐き出そうとしているだけではないことがわかります。1石で2羽の鳥を殺したかった(パフォーマンスを向上させ、マルチスレッドの基礎を学ぶ)が、問題の大部分は私の計算にあり、スレッド化はパフォーマンスの向上に値するよりも手間がかかるようだ。みなさん、ありがとうございます。もう一度答えを読んで、学校が終わったら解決策を試します。
k
このO(n^2)
問題の多くを減らすでしょう。
sin² + cos² ≡ 1
とにかく既に正規化されているためです!関心のある2つのオブジェクトを接続する元のベクトルを使用し、この1つを正規化することもできます。トリガー呼び出しは一切必要ありません。