Wie werden Spiele für verschiedene Plattformen erstellt?
Call of Duty: Modern Warfare 3 ist beispielsweise für PS3, Xbox 360, Wii und PC verfügbar.
Sind sie ohne gemeinsamen Code komplett neu programmiert? Gibt es einen Zwischencode?
Wie werden Spiele für verschiedene Plattformen erstellt?
Call of Duty: Modern Warfare 3 ist beispielsweise für PS3, Xbox 360, Wii und PC verfügbar.
Sind sie ohne gemeinsamen Code komplett neu programmiert? Gibt es einen Zwischencode?
Antworten:
Die meisten Game-Engines auf Produktionsebene verfügen über eine sogenannte Hardware-Abstraktionsschicht. Dies ist eine generische API, mit der die Spiel-Engine mit Hardware kommunizieren kann, ohne wissen zu müssen, um welche Hardware es sich handelt. Sie rufen einfach SoundManager.PlaySFX (SFX_ID) oder ähnliches auf. Darunter im Soundmanager wird es jedoch wissen, auf welcher Hardware es tatsächlich arbeitet, und die entsprechenden Anrufe tätigen, um den Soundeffekt abzuspielen.
Auf diese Weise kann die Engine unter Verwendung dieser Abstraktionsebene entwickelt werden, sodass sie auf jedem System ausgeführt werden kann, sofern für diese Hardware eine API bereitgestellt wird, die der Abstraktion entspricht. BEARBEITEN: Wie von Johnathan festgestellt, ist eine API für jede Plattform erforderlich, auf der Sie ausgeführt werden möchten. Und zu Trevors Punkt: Wenn Sie von einem System mit hohem Speicher zu einem Speicher mit niedrigem Speicher wechseln (das Schlimmste für mich war PS3 zu PSP), müssen Sie möglicherweise die verschiedenen Hardwareeinschränkungen in Angriff nehmen. Zum Glück musste ich aufgrund einer Plattform nicht ein ganzes System neu schreiben, sondern Objekte durchgehen und optimieren, um weniger Platz zu beanspruchen.
Die andere Seite der Dinge liegt im Kunstbereich, wo die Auflösungen von Texturen oder Modellen und dergleichen unterschiedlich sind. Die Assets des Spiels können auf ein bestimmtes Ziel ausgerichtet werden, sodass ein PC seine WAV-Dateien für seine Soundeffekte erhält, während sie in die spezifischen Formate umgewandelt werden, die von der PS3 und dergleichen unterstützt werden.
Hoffe das hilft.
Die anderen Antworten beschreiben die Dinge im Idealfall. Der meiste Code ist für Spiele üblich, und für hardware- / plattformabhängige Teile wird eine saubere Abstraktionsschicht verwendet.
Viele Spiele haben jedoch Ports, die von einem ausgelagerten Unternehmen erstellt wurden, und der Code unterscheidet sich erheblich. Dies gilt insbesondere für die Konsolen, aber auch für Ports zu OSX oder Linux von Windows.
Auf Konsolen ist die Hardware so unterschiedlich, dass häufig ganze Teile des Core-Renderings (und selten auch andere Systeme) vollständig neu geschrieben werden müssen. Auf dem PC können Sie Abstracts über D3D und OpenGL erstellen, da sich die Betriebssystem-APIs unterscheiden, die gesamte PC-Hardware jedoch ungefähr gleich ist.
Auf dem Konsolenbereich können Sie möglicherweise feststellen, dass Ihre supereffiziente, wunderschöne Rendering-Engine nicht direkt auf eine andere Konsole portiert werden kann, da die GPU-Funktionen so unterschiedlich sind und Sie buchstäblich jeden letzten Prozentsatz der Leistung herausholen müssen, um 7 Jahre zu erhalten alte Hardware für Ihr modernes Spiel. Sie können leicht Fälle finden, in denen die Beleuchtungspässe, die auf der XBox am besten funktionieren, auf der PS3 fürchterlich langsam sind und bei denen die PS3-Hunde auf der XBox am besten funktionieren. Die anderen Hardware- und Plattformunterschiede (z. B. die SPUs auf der PS3 gegenüber der Tri-Core-CPU der XBox) machen es sehr schwierig, sich auf eine einfache dünne Hardware-Abstraktionsschicht als einzigen plattformabhängigen Codepfad zu verlassen.
Da jede Plattform auch ein umfangreiches Fachwissen erfordert, um sie ordnungsgemäß zu nutzen, erfordern viele Spiele eine spezialisierte ausgelagerte Portierungsfirma, um das Spiel auf zusätzliche Plattformen zu bringen. Im PC-Bereich finden Sie manchmal Solo-Entwickler, die die Ports ausführen (wie Ryan "icculus" Gordon, der viele Linux-Game-Ports ausführt; normalerweise einfache Arbeit, indem Sie D3D in GL und Win32 in POSIX / SDL ändern), während Sie sich im Konsolenbereich befinden Es gibt Unternehmen mit allen Teams, die ziemlich umfangreiche Portierungsarbeiten für größere Spiele durchführen.
Ports zu einigen Plattformen erfordern fast vollständige Umschreibungen oder Asset-Redesigns. Die Wii-Ports von Call of Duty wurden beispielsweise von einem ausgelagerten Unternehmen ausgeführt, und alles - einschließlich der Kunstgegenstände - musste überarbeitet werden, um den Einschränkungen der sehr begrenzten Hardware der Wii gerecht zu werden. Die Wii hat zum Beispiel nicht einmal Shader, so dass es absolut unmöglich war, dieselbe Engine und dieselben Effekte / Materialien einfach wiederzuverwenden, und der begrenzte Speicher und die CPU / GPU erforderten kleinere Texturen und weniger Detailmodelle sowie Spielbeschränkungen und so weiter. Ports zu mobilen Plattformen werden in der Regel ebenfalls vollständig neu geschrieben, normalerweise von Dritten.
Neuere Engines erleichtern das Portieren zwischen Plattformen, aber größere Spiele müssen in der Regel noch beträchtliche Teile ihres Codes aktualisieren und viele Assets wiederholen, um von leistungsfähigeren PC-Plattformen und -Konsolen zu eingeschränkteren Plattformen zu wechseln.
James Antwort bezieht sich nur auf den PC und nicht auf die Implementierung auf den spezifischen Plattformen.
Während alle Engines die Plattform für den größten Teil des Spielcodes abstrahieren, müssen einige Teile pro Plattform geschrieben werden. Dies umfasst alle E / A einschließlich Netzwerk, Rendering, Audio, Geräteeingabe und meiner Meinung nach Videoausgabe.
Vergleichen Sie den Rendering-Code für beispielsweise Unreal auf der Xbox und PS3. Die Xbox verwendet die Xbox DirectX-Version, während die PS3 libgcm verwendet (die OpenGl-Bibliothek ist zu langsam). Um es ein wenig zu vereinfachen, sehen die Gameplay-Programmierer auf allen Plattformen nur ein "AudioSystem.PlaySound ( SoundName hier )", während für jede Plattform, die sie intern funktionieren, die Plattform-API für die Tonausgabe
aufgerufen wird . Weitere Informationen finden Sie in Tatrads Kommentar.