2009-04-13 2 views
1

Ich bin neu in Threads, SDL und wie Grafik im Allgemeinen arbeiten. Ich habe alle LazyFoo SDL Tutorials durchgesehen und mir sehr geholfen. Aber in seinen Tutorials über Multithreading kommentierte er, dass man niemals Videofunktionen in separaten Threads verwenden sollte oder Probleme verursachen könnte. Ich bin neugierig, wie es gemacht werden sollte, da ich immer noch ein vages Verständnis für Grafiken und Threads habe.Wie verwende ich SDL_Threads richtig?

Als eines meiner Projekte ist ein Shoot'em up, ich frage mich, ob ich einen Thread erstellen soll, der alle Grafiken anzeigt, ein Thread erhält alle Player-Eingaben für sein Schiff und einen weiteren Thread für die feindliche KI.

Wenn dies NICHT ist, wie es gemacht werden sollte, (ich denke, es ist falsch) hat jemand einen Ratschlag, wie Grafiken mit Benutzereingaben und Feind KI mit Threads implementiert werden sollten?

für die Lazyfoo des Tutorials, dann ist dies der Link: http://lazyfoo.net/SDL_tutorials/

Antwort

0

Generell finde ich es eine gute Idee ist es, den Rendering-Thread von den UI/AI Fäden zu trennen. Es hilft, Ihren Code verständlicher zu halten. Da es im Quellcode viele Spiele gibt, warum sollten Sie nicht herausfinden, wie sie das gemacht haben?

0

Es kann viel einfacher sein, Threads auf Verantwortungsbasis zu trennen, wenn Sie anfangen. Der "richtige" Weg, sich diesem zu nähern, was zu einer größeren Skalierbarkeit führt, ist die Verwendung von Thread-Pools. Es gibt vorgefertigte Thread-Pool-Lösungen, einschließlich einer für SDL.

Wenn Sie OpenGL oder DirectX zum Rendern verwenden, bezweifle ich, dass die Aufrufe dieser APIs viel Overhead generieren, so dass Sie zumindest die (notwendigerweise) sequentiellen Teile Ihrer Spielschleife im Hauptthread ausführen könnten: Eingabe erhalten, Weltmodell aktualisieren (einschließlich der Ergebnisse von Berechnungen), rendern. Dann können Sie AI haben, Netzwerk-Threads laufen parallel. Somit müssen Sie sich keine Gedanken über einen separaten Rendering-Thread machen. Es gibt eine Ausnahme: Wenn Sie rechenintensives (und ich meine in Raycasting/Raytracing schweres) Rendering in Software durchführen, dann wäre es besser, wenn Sie Rendering- "Logik" auf einem parallelen Thread ausführen und in einen Framebuffer schreiben. und dann in deinem Hauptthread, der die oben angegebene Sequenz macht, und einfach deinen vorbereiteten Framebuffer mit Hilfe von zB. GDI.

In Bezug auf Rendering, ja AFAIK-Rendering von nur einem einzigen Thread (der Haupt-Thread) ist (oder war) im Allgemeinen eine gute Idee, um sicherzustellen, dass z. Mit OpenGL hast du keine Probleme. Auch dies ist auf den großen Plattformen kein Problem mehr. Außerdem weiß ich nicht, ob GDI oder DirectX die gleichen Probleme haben.