Ich habe ein Spiel-Engine Schleife implementiert:Gibt es Best Practices für die Implementierung einer asynchronen Game-Engine-Schleife? wie folgt
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;
}
ich die AsyncResult
Klasse von Jeff Richter in seinem Artikel empfohlen verwende, Implementing the CLR Asynchronous Programming Model. Um die Engine von der Benutzeroberfläche aus stoppen zu können, war die Implementierung, die ich verwendete, ein wenig außerhalb des asynchronen Standardmusters. Diese Implementierung funktioniert wie erwartet, aber wenn ich mich von einer Standardpraxis abwende, wende ich mich an die SO-Community, um sicherzustellen, dass ich die Dinge richtig mache.
Gibt es Probleme mit dieser Implementierung, die jeder sehen kann?
in einer Game-Engine-Schleife, würden Sie nicht einfach einen neuen Thread erzeugen, anstatt einen Pool Faden? –
@Mitch: Ich bin mir nicht wirklich sicher. Ich glaube, dass das Entstehen eines neuen Threads Standard ist. Ich weiß nicht, dass mit der Verwendung eines Threadpool-Threads etwas nicht in Ordnung ist. Diese Spielemaschine ist superleicht. Da eine WinForms-Benutzeroberfläche * in der Steuerung * ist, dachte ich, dies wäre ein guter Weg, die Spielschleife zu bearbeiten. – IAbstract
Warum benutzt du * irgendwelche * Threads in einer Spielschleife? Wenn Sie * any * brauchen (was wirklich gut in Frage gestellt werden sollte), sollten die Threads wahrscheinlich vorher erstellte Threads für einen * spezifischen, genau definierten Zweck * sein (z. B. immer 2 Threads usw., die fortlaufend leben), die aus einer Warteschlange heraus arbeiten oder andere Synchronisation. Am besten ist es jedoch, es "KISS" zu behalten. –