次のように私は、ゲームエンジンのループを実装している:非同期ゲームエンジンループを実装するためのベストプラクティスはありますか?
public static Boolean Start ()
{
if (hasBoard)
{
// start engine on worker thread
asyncTask = new AsyncResult (stopEngine, asyncTask);
isRunning = ThreadPool.QueueUserWorkItem (startEngine, asyncTask);
if (isRunning)
{
Console.WriteLine ("[{0}] Engine started",
DateTime.Now.ToString ("hh:mm:ss"));
}
else
{
Console.WriteLine ("[{0}] Engine failed to start",
DateTime.Now.ToString ("hh:mm:ss"));
}
}
return isRunning;
}
public static void Stop ()
{
Console.WriteLine ("[{0}] Engine stopping",
DateTime.Now.ToString ("hh:mm:ss"));
asyncTask.SetAsCompleted (null, false);
}
private static void startEngine (Object task)
{
while (!((IAsyncResult)task).IsCompleted)
{
Thread.Sleep (10000);
Console.WriteLine ("[{0}] Engine running",
DateTime.Now.ToString ("hh:mm:ss"));
}
}
private static void stopEngine (IAsyncResult iaResult)
{
// clean up resources
Console.WriteLine ("[{0}] Engine stopped",
DateTime.Now.ToString ("hh:mm:ss"));
isRunning = false;
}
私は彼の記事、Implementing the CLR Asynchronous Programming Modelにジェフ・リヒターが推奨するAsyncResult
クラスを使用しています。 UIからエンジンを停止できるように、私が使った実装は、標準の非同期パターンからちょっと離れていました。この実装は期待どおりに機能しますが、標準的な習慣から逸脱すると、私はSOコミュニティに戻って、正しい方法で作業するようにします。
誰にでも見えるこの実装に関する問題はありますか?
ゲームエンジンのループでは、単にプールスレッドを使用するのではなく、 –
@Mitch:わかりません。私は新しい糸を産むことが標準だと信じています。私は、スレッドプールスレッドを使用して何か問題があることを知らない。このゲームエンジンは超軽量です。また、WinFormsのUIは*制御されているので、これはゲームループを動作させる良い方法だと思っていました。 – IAbstract
ゲームループで*スレッドを使用しているのはなぜですか?あなたが*必要なものがあれば(本当によく質問されるべきです)、スレッドは、キューから取り除かれる特定の明確に定義された目的*(例えば、常時2つのスレッドなど常に)または他の同期。しかし、それを「キス」にしておくのが最もよいでしょう。 –