Irgendwelche Tipps zum Erstellen von plattformübergreifenden Spielen? [geschlossen]

39

Haben Sie Tipps / Empfehlungen zum Erstellen eines plattformübergreifenden Spiels in C / C ++?

Matias Valdenegro
quelle

Antworten:

44

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?

herrlich
quelle
2
Mangel an #ifdef PLATFORM_WINftw
tenpn
Dem entkommst du nie. Sie können nur hoffen, es zu minimieren.
Munificent
8
Eine gute Möglichkeit, dies zu tun, besteht darin, den gesamten plattformspezifischen Code in eine Gruppe gemeinsam genutzter Bibliotheken mit derselben Schnittstelle zu verschieben. Dann können Sie die # ifdefs darauf beschränken, die richtige Bibliothek für die Plattform zu booten.
Neel
1
+1, toller Kommentar. Denken Sie daran, dass auch die STL plattformabhängig ist (und ja, einige Funktionen führen auf verschiedenen Compilern unterschiedliche Aktionen aus).
Simon
Sicherlich verringert das Aufrufen einer zusätzlichen Funktion die Leistung? Die CPU muss Daten aus Registern laden oder verschieben, oder schlimmer noch, Speicher, der noch langsam ist. Würde ein Systemaufruf nicht ausreichen?
TheBlueCat
10
  • 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.

SD021
quelle
Der zweite Punkt kann nicht genug betont werden. Stellen Sie sicher, dass Sie wissen, für wen das Spiel bestimmt ist (dh, wenn es sich um ein Gelegenheitsspiel handelt, möchten Sie es zumindest unter OSX und Windows haben, daher ist OpenGL die beste Option). Wichtig ist auch der dritte Punkt - und hier kommt der Motor ins Spiel. Es wäre unlogisch, eine funktionsreiche, ressourcenintensive Engine wie Unreal zu verwenden, um ein DS-Spiel zu erstellen. Der Punkt hängt auch mit dem zusammen, was ich zum zweiten gesagt habe: Stellen Sie fest, für wen das Spiel bestimmt ist. Wenn Sie sich für ein Gelegenheitsspiel entscheiden, können die meisten Computer beispielsweise keine Partikel verarbeiten.
7

Vermeiden Sie Streuungen im #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifgesamten 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.

NocturnDragon
quelle
4

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.).

Karantza
quelle
4

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.

kevin42
quelle
+1 * 9000. Ich denke, dies würde wirklich nur für Mobiltelefone in Bezug auf moderne / gebrauchte Architekturen (RISC) gelten; aber immer noch entscheidend.
Jonathan Dickinson