Qualche consiglio per la creazione di giochi multipiattaforma? [chiuso]


Risposte:


44

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?


2
mancanza di #ifdef PLATFORM_WINftw
tenpn

Non ti sfuggirai mai. Puoi solo sperare di minimizzarlo.
munifico

8
Un buon modo per farlo è spostare tutto il codice specifico della piattaforma in un set di librerie condivise con la stessa interfaccia, quindi puoi limitare # ifdef's al bootstrap della libreria corretta per la piattaforma.
Neel,

1
+1, ottimo commento. Ricorda che anche l'STL dipende dalla piattaforma (e sì, alcune funzioni fanno cose diverse su diversi compilatori).
Simone,

Sicuramente chiamare una funzione aggiuntiva ridurrà le prestazioni? La CPU deve caricare o spostare i dati dai registri o peggio ancora, la memoria è ancora lenta. Una chiamata di sistema non sarebbe sufficiente?
TheBlueCat

10
  • 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.


Il secondo punto non può essere sottolineato abbastanza. Assicurati di sapere a chi è rivolto il gioco (nel senso che, se si tratta di un gioco casual, vorresti averlo almeno su OSX e Windows, quindi OpenGL sarebbe l'opzione migliore). Per quanto riguarda il terzo punto - ed è qui che entra in gioco il motore - è anche importante. Sarebbe illogico utilizzare un motore ricco di funzionalità e ricco di risorse come Unreal per creare un gioco per DS. Il punto è anche legato a quello che ho detto riguardo al secondo: stabilire a chi è rivolto il gioco. Se stai cercando un gioco casual, i computer della maggior parte delle persone non gestiranno, diciamo, le particelle.

7

Cerca di evitare la dispersione in #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endiftutto 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.


4

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


4

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.


+1 * 9000. Immagino che questo si applicherebbe davvero solo ai telefoni cellulari in termini di architetture moderne / usate (RISC); ma ancora cruciale.
Jonathan Dickinson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.