Sie sprechen von "Multithreading-Schwierigkeiten", aber über welche Schwierigkeiten sprechen Sie tatsächlich? In gewisser Weise zitieren Sie ein Phantomproblem, das möglicherweise gar nicht existiert. Die eigentliche Herausforderung stellen Sie sich selbst - wenn Sie absolut entschlossen sind, den letzten Tropfen der Energie aus einem Stück Hardware herauszuholen, bedeutet dies, dass Sie die Hardware optimal einsetzen, aber auch die Kluft zwischen den leistungsstärksten Maschinen vergrößern und der am wenigsten mächtige. Dies hat zur Folge, dass Sie, wenn Sie ein Spiel haben, das wirklich das Beste aus einer PS3 macht (zum Beispiel), es sowieso nicht auf einem billigen Mobiltelefon laufen lassen können, sodass Ihr Problem nicht mehr darin besteht, wie ich 1 Programm bekommen kann auf sehr unterschiedlicher Hardware arbeiten "wird aber" wie kann ich 1 Spielidee auf verschiedene Arten umsetzen, damit es auf unterschiedlich starker Hardware funktioniert ".
Während eine Bibliothek wie SDL eine plattformübergreifende Wrapper-API für das Threading bereitstellt, wäre es meiner Meinung nach naiv anzunehmen, dass dies direkt zur einfachen Entwicklung von Spielen auf sehr unterschiedlichen Plattformen (Desktop / Mobile) führt.
Einfache Entwicklung von Spielen - klar. Optimales Multithreading, nein. Aber Sie müssen nicht brauchen Multithreading - Spiele zu machen. Um Hochleistungsprodukte herzustellen, ist es sicherlich hilfreich. Aber viele großartige Spiele laufen in einem einzigen Thread.
Was ist der beste Weg, um die Entwicklung auf diese Weise anzugehen (unter Berücksichtigung einer plattformübergreifenden Threading-API), wenn Folgendes berücksichtigt wird:
- unterschiedliche Anzahl von Kernen
- Sehr unterschiedliche Verarbeitungsmöglichkeiten pro Kern
- Eine generell andere Systemarchitektur mit z. Unterschiedliche Latenzen für Cache, RAM und E / A-Zugriff
Anstatt zu versuchen, Systeme Threads zuzuweisen, weisen Sie Threads Tasks zu. Weisen Sie jeder Aufgabe die Daten zu, die sie zum Ausführen benötigt, und führen Sie die Aufgaben auf der jeweils verfügbaren Hardware aus. Normalerweise haben Sie eine Art Thread-Pool, um die verschiedenen Kerne oder Prozessoren zu abstrahieren, und einen Task-Manager, der eine Reihe von Tasks enthält und diese an die verschiedenen Threads weitergibt, wenn der Thread signalisiert, dass er die vorherige Task beendet hat und beendet ist bereit für einen neuen. Hardware mit mehr Kernen erledigt die Aufgaben offensichtlich schneller und kann schneller gerendert werden. Die Spezialisierung dieses Systems auf ein optimales Arbeiten auf Systemen mit unterschiedlichen Merkmalen wird zu einem fortgeschrittenen Optimierungsproblem, kann jedoch auf bestimmten Heuristiken beruhen (z. B. einer Aufgabe, die nicht erfüllt ist).
Die Zerlegung von Spielfunktionen in einzelne Aufgaben ist jedoch eine recht komplexe Angelegenheit und oft nicht die Mühe wert, es sei denn, Sie sind sich sehr sicher, dass Sie die Leistung benötigen, und die meisten werden es nicht einmal versuchen.
Einige weitere Lektüre:
http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - siehe Abschnitt 'Daten parallel'. Bei diesem Modell werden die Daten auf mehrere identische Tasks aufgeteilt und auf einzelne Threads verteilt.
http://software.intel.com/de-de/articles/designing-the-framework-of-a-parallel-game-engine/ - ziemlich dicht, beschreibt Dinge auf Betriebssystemebene und nicht auf Spielebene.
http://drdobbs.com/high-performance-computing/216500409 - nicht spielspezifisch, aber absolut relevant für die Aufteilung der Aufgaben.
http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - Auf halbem Weg ist dieses Interview eine Anekdote darüber, wie sie auf ein aufgabenbasiertes System migriert sind .