Haben Sie Tipps / Empfehlungen zum Erstellen eines plattformübergreifenden Spiels in C / C ++?
Haben Sie Tipps / Empfehlungen zum Erstellen eines plattformübergreifenden Spiels in C / C ++?
Antworten:
Verstecken Sie plattformspezifische Elemente hinter Abstraktionsebenen
Dies bedeutet Dinge wie Rendering, Audio, Benutzereingaben und Datei-E / A. Ein häufiger Trick, um dies zu abstrahieren, ohne dass dies zu einer Beeinträchtigung der Laufzeitleistung führt, sind plattformunabhängige Header mit plattformspezifischen Implementierungsdateien:
// FileSystem.h
class FileSystem {
public:
FileHandle OpenFile(const char * path);
// other stuff...
}
// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
// call windows API...
}
Konfigurieren Sie dann die Builds für jede Plattform so, dass sie mit der richtigen CPP-Datei erstellt werden.
Machen Sie Ihre Content-Pipelines plattformunabhängig und geben Sie plattformspezifische Inhalte für jede Plattform aus
Erstellen Sie Ihre Texturen beispielsweise als .tga oder nur als .psd und verwenden Sie dann eine Pipeline, die diese automatisch in die verschiedenen plattformspezifischen Formate konvertiert, die Sie benötigen.
Nehmen Sie kein bestimmtes Speicherlayout oder Endianness in Ihren Daten an
Plattformen können in Byte-Reihenfolge, Abstand, Ausrichtung und Wortgröße variieren. Jeder Code, der sich darum kümmert, muss auf allen Plattformen gründlich getestet werden.
Testen Sie die ganze Zeit auf allen Plattformen
Sie werden von plattformspezifischen Fehlern gebissen. Würdest du jetzt lieber gebissen werden oder richtig, wenn du versuchst, das Spiel aus der Tür zu bekommen?
Verwenden Sie eine API wie opengl / sdl, die Ihnen beim Übergang von Plattform zu Plattform nur minimale Probleme bereitet.
Stellen Sie sicher, dass Sie wissen, welche Plattformen Sie unterstützen möchten. Verwenden Sie opengl nicht, nur weil Sie denken, dass Sie in Zukunft möglicherweise mehrere Plattformen unterstützen möchten. Beginnen Sie, wie Sie weitermachen wollen.
Informieren Sie sich über die Hardwarebeschränkungen auf den einzelnen Plattformen, die Sie unterstützen möchten.
Vermeiden Sie Streuungen im #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
gesamten Code.
Manchmal sieht es so aus, als ob es der einfachere Weg wäre, aber es wird Ihnen auf lange Sicht Probleme bereiten. Sie sollten versuchen, sie auf ihre eigene Datei zu beschränken, damit jede Plattformimplementierung eigenständig ist.
Beim Hinzufügen einer Plattform sollte es hauptsächlich darum gehen, neue Implementierungsdateien hinzuzufügen und nur die wenigen erforderlichen vorhandenen zu ändern.
Es gibt viele Bibliotheken, die selbst plattformübergreifend sind. Sie müssen nicht direkt in OpenGL schreiben, um irgendwo ausgeführt zu werden. OGRE ist ein großartiges Beispiel für eine Rendering-Engine, die auf jeder Plattform funktioniert, die Sie benennen möchten.
Nach meiner Erfahrung ist das größte Problem Ihr Build-System. Wenn Sie mit Visual Studio unter Windows entwickeln, wird Ihr Code möglicherweise unter Linux kompiliert, aber es fällt Ihnen schwer, ihn problemlos zu erstellen . Sehen Sie sich Build-Systeme wie CMake an, die dieselben Build-Anweisungen verwenden können, um plattformspezifische Projektdateien zu generieren (Makefiles unter Linux, VS Projects unter Windows, XCode Projects unter Mac usw.).
Wenn Ihre Funktionen zum Speichern und Laden von Dateien zu schreiben, oder Kommunikation über ein Netzwerk, vergessen Sie nicht über endianness .
Erstellen Sie ReadByte / WriteByte und ReadFloat / WriteFloat, anstatt eine große Struktur mit einem einzigen Aufruf von fread / fwrite oder einer ähnlichen niedrigen Ebene zu lesen. Dann haben Sie weniger Änderungsmöglichkeiten, wenn Sie sich später für eine andere Plattform entscheiden.
#ifdef PLATFORM_WIN
ftw