2010-11-13 1 views
8

Ich benutze SDL für die Ansicht Teile meines Spielprojekts. Und ich möchte wichtige Presseereignisse behandeln, ohne den Hauptthread zu unterbrechen. Also entschied ich mich, eine Endlosschleife in einem anderen Ansichts-Thread auszuführen, um alle Ereignisse abzufangen und den Haupt-Thread zu informieren. Ich bin mir jedoch nicht sicher, ob dies die beste Lösung ist, da dies zu einer Arbeitsbelastung führen und die Systemleistung beeinträchtigen kann. Gibt es einen besseren Weg, diese Art von Dingen zu tun? Danke.Was ist der beste Weg, um Event mit SDL/C++ zu behandeln?

Antwort

7

Stören Sie nicht mit einem anderen Thread. Was ist der Punkt?

Was macht Ihr Haupt-Thread? Ich stelle mir so etwas wie dieses:

  1. Update-Logik
  2. Goto 1

Render Wenn Sie Eingabe nach (oder während) den Aktualisierungszyklus erhalten, dann müssen Sie bis zum nächsten Update warten bevor Sie die Effekte sehen. Das gleiche gilt für das Rendering. Sie können auch vor dem Update-Zyklus nur nach Eingaben suchen und alles einthread-fähig machen.

  1. Eingang
  2. Update-Logik
  3. Render
  4. Goto 1

Multithreading gewinnt nichts hier und erhöht nur die Komplexität.

Für einige zusätzliche Informationen, schauen Sie sich Christer Ericson's blog post about input latency (er ist der Direktor der Technologie für das Team, das God of War macht).

+0

Das und der Eingang ist nicht threadsicher. Viele SDL-Tutorials geben dies explizit an. – new123456

5

Und ich möchte Tasten drücken Ereignisse ohne Unterbrechung der Haupt-Thread.

SDL ist nicht inhärent ein Interrupt- oder ereignisgesteuertes Framework. IO tritt durch Lesen von Ereignissen aus der Ereigniswarteschlange durch Aufrufen von SDL_WaitEvent oder SDL_PollEvent auf. Dies muss im Thread "main" geschehen, der SDL_SetVideoMode heißt.

Das heißt nicht, dass Sie nicht mehrere Threads verwenden können, und es gibt gute Gründe dafür, zum Beispiel kann es die Netzwerkkommunikation vereinfachen, wenn es nicht auf die SDL-Ereignisschleife angewiesen ist. Wenn Sie die Simulation in einem separaten Thread auftreten möchten, kann es Informationen durch synchronisierte freigegebene Objekte hin und her übergeben. Insbesondere können Sie Ereignisse aus jedem Thread sicher in die SDL-Ereigniswarteschlange einfügen.