Hai suggerimenti / raccomandazioni durante la creazione di un gioco multipiattaforma in C / C ++?
Hai suggerimenti / raccomandazioni durante la creazione di un gioco multipiattaforma in C / C ++?
Risposte:
Nascondi qualsiasi cosa specifica della piattaforma dietro i livelli di astrazione
Questo significa cose come rendering, audio, input dell'utente e file IO. Un trucco comune per sottrarre che senza indurre una penalità delle prestazioni di runtime sono le intestazioni indipendenti dalla piattaforma con file di implementazione specifici della piattaforma:
// FileSystem.h
class FileSystem {
public:
FileHandle OpenFile(const char * path);
// other stuff...
}
// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
// call windows API...
}
Quindi configura le build per ogni piattaforma in modo da creare il file .cpp corretto.
Trasforma le tue pipeline di contenuti in risorse indipendenti dalla piattaforma e dai contenuti specifici della piattaforma di output per ciascuna piattaforma
Ad esempio, crea le tue trame come .tga o semplicemente .psd, quindi disponi di una pipeline in grado di convertirle automaticamente nei diversi formati specifici della piattaforma di cui hai bisogno.
Non assumere uno specifico layout di memoria o endianness nei tuoi dati
Le piattaforme possono variare in ordine di byte, riempimento, allineamento e dimensioni delle parole. Qualsiasi codice che se ne preoccupa deve essere accuratamente testato su tutte le piattaforme.
Test su tutte le piattaforme, sempre
Si dovrà ottenere morso da bug della piattaforma-specifici. Preferiresti essere morso ora, o proprio quando stai cercando di far uscire il gioco dalla porta?
Usa un API come Opengl / SDL che ti darà il minimo fastidio quando si passa da una piattaforma all'altra.
Assicurati di sapere quali piattaforme vuoi supportare. Non usare l'opengl solo perché pensi che potresti voler supportare la multi-piattaforma in futuro. Inizia come intendi continuare.
Scopri quali sono le limitazioni hardware su ciascuna delle piattaforme che desideri supportare.
Cerca di evitare la dispersione in #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
tutto il codice.
A volte sembra che sia il modo più semplice, ma a lungo andare ti darà problemi. Dovresti provare a limitarli al loro file, in modo che ogni implementazione della piattaforma sia autonoma.
L'aggiunta di una piattaforma dovrebbe principalmente riguardare l'aggiunta di nuovi file di implementazione e modificare solo quelli pochi necessari esistenti.
Ci sono molte librerie che sono esse stesse multipiattaforma; non è necessario scrivere direttamente in OpenGL per funzionare ovunque. OGRE è un ottimo esempio di motore di rendering che funziona su qualsiasi piattaforma di cui ti piacerebbe nominare.
Nella mia esperienza, la più grande preoccupazione è il tuo sistema di compilazione. Se sviluppi su Windows con Visual Studio, il tuo codice potrebbe essere compilato in Linux, ma avrai difficoltà a costruirlo facilmente. Guarda i sistemi di compilazione come CMake che possono utilizzare le stesse istruzioni di generazione per generare file di progetto specifici della piattaforma (makefile su Linux, progetti VS su Windows, progetti XCode su Mac, ecc.).
Quando scrivi le tue funzioni per salvare e caricare file o per comunicare in rete, non dimenticare l' endianness .
Invece di leggere una grande struttura con una sola chiamata per fread / fwrite o qualcosa di basso livello come quello, crea un ReadByte / WriteByte e ReadFloat / WriteFloat. Quindi avrai meno posti per apportare modifiche se decidi di scegliere come target una piattaforma diversa in un secondo momento.
#ifdef PLATFORM_WIN
ftw