2011-01-02 14 views
7

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?

+0

in einer Game-Engine-Schleife, würden Sie nicht einfach einen neuen Thread erzeugen, anstatt einen Pool Faden? –

+0

@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

+1

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. –

Antwort

11

Da dies wie ein Projekt klingt, über das Sie die Kontrolle haben, würde ich vorschlagen, APM zu entfernen und das in .NET4 bereitgestellte Task -basierte Modell zu verwenden. Dies ist der empfohlene Ansatz für .NET4 anstelle von APM. Die Task Klasse ist Teil der Task Parallel Bibliothek (TPL), aber es ist großartig für diese grundlegenden asynchronen Aufträge als auch.

+2

Einverstanden, aber ich würde eine LongRunning-Option beim Erstellen der Aufgabe hinzufügen. –

+0

machte ich die Änderung der LongRunning Option hinzuzufügen: 'Task.Factory.StartNew (() => startEngine (cancelSource.Token), cancelSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);' – IAbstract

2

Ich würde sagen, dass es impliziert, dass Aufgaben bei Verwendung des Threadpools kurzlebig sind, da die Anzahl der Threads darin begrenzt ist.

In Ihrem Fall würde ich einen Background verwenden, da Sie WinForms erwähnt. BW Griffe Synchronisation für Sie und ist daher in der Lage, die GUI zu aktualisieren, ohne InvokeRequired usw.

+0

* Es wird angedeutet, dass Aufgaben kurzlebig bei der Verwendung des Thread-Pools * - nicht nach Jeff Richter ... es sei denn, ich habe wirklich etwas verpasst. Wie auch immer, ich sehe Ihren Standpunkt darin, Thread-Thread-Tasks kurz zu halten. – IAbstract

+0

@IAbstract: Haben Sie eine Referenz dafür? Wäre interessant zu lesen. – jgauffin

+0

Ich würde es wieder finden müssen - es ist gut über anderthalb Jahre her, seit ich den Kommentar abgegeben habe. Die Implikation, dass eine Aufgabe kurzlebig ist, könnte auf die Standardbehandlung zurückzuführen sein - d. H. Wir müssen eine Aufgabe als lang andauernd festlegen, wenn wir eine lange Ausführungszeit erwarten. Es muss etwas Sinnvolles in dem was ich kommentiert haben, aber ich werde versuchen zu finden, worauf ich mich beziehe. ;) – IAbstract