Gli strumenti della pipeline di contenuti devono essere incorporati nel motore?


10

Quanto minimo dovrebbe essere un motore di gioco? Quanta parte della pipeline di contenuti deve essere incorporata nel motore?

Alcuni casi d'uso in cui il super motore potrebbe essere utile:

  • Quando si carica il contenuto dell'utente, l'utente non è tenuto a impacchettare le sue trame, il motore lo farà al momento del caricamento.

  • Uno script richiede un carattere di dimensioni molto maggiori di quanto non sia stato pre-generato, il motore potrebbe analizzare l'annuncio del file ttf per creare un nuovo atlante delle trame.

  • Forgia di Halo .

Niente di tutto questo è gratuito, ovviamente. Ciò richiede che gli strumenti della pipeline dei contenuti siano scritti in C ++. Le librerie di supporto utilizzate nella pipeline devono essere compilate per l'uso sul dispositivo. Richiede che la generazione del contenuto non sia buggy. E generalmente rende il tuo motore più grande e ingombrante.
Quali sono alcuni altri pro e contro?
I professionisti superano i contro?

Alcune domande specifiche:

  • Il motore dovrebbe essere in grado di caricare vari formati di immagine? Un caricatore solo TGA è un codice abbastanza semplice da gestire.

  • E i formati audio? È possibile supportare solo il caricamento di file wav? Che dire dei file musicali ambient che sono spesso enormi.

  • Il motore dovrebbe essere in grado di analizzare in modo dinamico TTF e generare atlanti?

  • Imballaggio di trama.

Risposte:


11

Il blog Games from Within di Noel Llopis ha toccato questo argomento di recente nel post "Remote Game Editing" . Il paragrafo iniziale:

Sono stato a lungo un fan di runtime di gioco minimi. Tutto ciò che può essere fatto offline o in uno strumento separato, dovrebbe essere fuori dal runtime. Ciò lascia l'architettura e il codice di gioco molto snelli e semplici .

(L'articolo è una lettura altamente raccomandata, come con la maggior parte delle cose di Noel, sia che tu sia d'accordo al 100% o meno.)

Credo che la chiave qui sia mantenere la complessità al di fuori del motore. Puoi ancora avere flessibilità, ma è flessibilità nella pipeline di contenuti. E ottieni prestazioni migliori non impiegando tempo a convertire e spostare i dati.

Prestazioni migliori possono tradursi in tempi di iterazione più bassi, stranamente, nonostante la perdita di alcune delle capacità di modifica interne al motore: è più facile provare qualcosa se riesci a caricare il gioco in un secondo.

L'adozione di alcuni dei principi della " filosofia unix " ti aiuterà a mantenere flessibile la tua toolchain: una piccola pipeline modulare.

La mia filosofia personale: cuocere quanti più dati possibile offline, ma fornire supporto al motore per ricevere nuovi dati in qualsiasi momento. (Nota che questi nuovi dati non hanno bisogno di entrare in gioco fino a un punto conveniente: viene premuto il pulsante "aggiorna", inizia il livello successivo, si passa a una nuova area, qualunque sia. Il tasto sta trovando il punto debole che minimizza tempo di iterazione con complessità minima del codice e sforzo di codifica.)

Nella nostra azienda la maggior parte dei nostri strumenti rivolti ad artisti / designer sono focalizzati su problemi di interfaccia utente: facilità di manipolazione di singoli asset o loro lotti, ecc. A volte sono solo strumenti di terze parti come Photoshop o 3DS Max. Questi strumenti vengono esportati in un formato intermedio (spesso XML che fa riferimento a dati binari di origine, ma non sempre). Il formato intermedio viene raccolto da uno strumento "data make" di backend, che lo trasforma in qualcosa di utile e di caricamento rapido per la piattaforma di destinazione.

La portabilità si ottiene aggiungendo ulteriori strumenti di creazione di dati di back-end o espandendo gli strumenti di creazione di dati di back-end esistenti, il che ha l'ulteriore vantaggio di essere invisibile ai creatori di contenuti.

Ora, con una corretta creazione di dati incrementali, puoi avere cambiamenti nel formato cotto in pochi secondi; il tuo motore può spider o uno strumento può spider e quindi questi appariranno nel tuo sistema di risorse, pronti per essere ricaricati quando è conveniente.

Gli strumenti, in particolare i dati di backend che creano strumenti, sono spesso più sciatti e più complessi del codice del motore. Va bene, perché sono più facili da refactoring / riscrivere, estendere e testare; hai specifiche per il loro comportamento ed è abbastanza facile testarle in unità rispetto ad alcuni codici motore.

Le mie opinioni sulle tue domande:

Il motore dovrebbe essere in grado di caricare vari formati di immagine? Un caricatore solo TGA è un codice abbastanza semplice da gestire.

(A parte: anche se usi un decodificatore TGA nel motore, non codificarlo manualmente. Stai solo chiedendo problemi - ci sono molte sottigliezze con la maggior parte dei formati di immagine e molti strumenti che non aderiscono esattamente nel formato probabilmente non specificato. È meglio trovare il codice libreria esistente ben collaudato per l'elaborazione delle immagini.)

Vorrei che lo strumento qui venisse convertito da TGA a qualunque sia il tuo formato di trama interno, oltre ai metadati.

E i formati audio? È possibile supportare solo il caricamento di file wav? Che dire dei file musicali ambient che sono spesso enormi.

Qui utilizziamo tre formati: musica tracciata (.xm), ADPCM (.wav) e Speex (.spx). Ciò è dovuto principalmente al fatto che siamo su palmari e questi formati sono molto leggeri da decodificare.

Il motore dovrebbe essere in grado di analizzare in modo dinamico TTF e generare atlanti? Imballaggio di trama.

L'atlante è un problema difficile: vedi le risposte alla tua domanda recente . Vale quasi sempre la pena farlo offline.

Inoltre, puoi trasformare i metadati per carattere in una struttura al forno con codice di carico quasi zero.

In chiusura, puoi ripulire e impacchettare questa pipeline con il tuo gioco, per la community mod. Puoi sempre aggiungere altri formati di origine. E non c'è nulla che ti impedisca di colmare il divario tra gli strumenti di creazione di contenuti e il motore in casi specifici; si spera che il codice di cottura dei dati e il codice ragno / trasferimento possano essere rifattorizzati in librerie che potrebbero in alcuni casi essere utilizzate direttamente dagli strumenti di creazione dei contenuti. Ma non vorrei che il mio primo obiettivo, necessariamente ... Sii solo consapevole del fatto che sarà un obiettivo finale e lascia che questo influenzi un po 'il tuo design, e scegli prima il frutto basso.


Come aggiornamento, potresti prendere in considerazione l'utilizzo del Formato file KTX per le trame. Ha il vantaggio di essere per lo più "read in structand go" per la maggior parte dei casi d'uso GL (e dai tuoi commenti sembra che tu stia prendendo di mira GL) pur essendo flessibile e ben definito.

L'overhead dell'intestazione KTX potrebbe essere un po 'alto per i dati completamente cotti, a seconda del target, e potresti voler rinunciare al supporto di swap endian, a seconda del tuo caso d'uso ... ma sicuramente vale la pena almeno uno sguardo per considerazioni di progettazione.


Grandi cose grazie. Non avevo mai preso in considerazione l'idea di creare un formato immagine facile da caricare. Esiste una libreria di caricamento delle trame minimale già costruita. Quindi di nuovo è fondamentalmente un flusso di byte con larghezza, altezza e codifica (cioè GL_RGB555).
deft_code

1
Non creare così tanto il tuo formato immagine, ma porta l'immagine nel formato esatto che DirectX, GL o qualunque cosa tu stia usando. =) Per quanto riguarda le biblioteche: ce ne sono un sacco là fuori. Per quanto riguarda gli strumenti, tendo a usare solo le cose della libreria ImageMagick ( imagemagick.org/script/index.php ) o anche i programmi ... Il codice ImageMagick è vecchio stile e un po 'brutto, ma piuttosto veloce, flessibile e stradale -tested. Sono sicuro che altri avranno molti altri suggerimenti; se stai usando ad esempio C # per la tua toolchain, molte di queste cose saranno già integrate nelle librerie .NET ...
leander

1
"Sono sicuro che altri avranno molti altri suggerimenti" MFC! :) O forse OpenIL. Penso che uno dei punti importanti sulla cottura delle risorse in formati specifici della piattaforma sia che quando aggiungi più formati di origine e più piattaforme esploderà il numero di combinazioni. La conversione delle risorse di origine in un formato intermedio e la successiva conversione in formati specifici della piattaforma ridurranno il numero di percorsi di conversione. Aggiungi un altro formato sorgente, basta scrivere un convertitore nel formato intermedio. Aggiungi un'altra piattaforma, aggiungi un fornaio al formato target di quella piattaforma.
Chris Howe,

1
Aggiungerei che mantenere la complessità al di fuori del motore non significa necessariamente che la funzionalità non sia disponibile per il motore. Mantenerlo separato, quindi è facilmente separato dal motore è la chiave. Non posso sottolineare abbastanza quanto sia utile supportare il caricamento a caldo delle risorse, vale a dire ricaricare le cose al volo. Anche questo può portare molta complessità nel tuo sistema, quindi ti consigliamo di assicurarti che sia costruito in modo tale che il gioco non debba preoccuparsi della provenienza delle risorse.
dash-tom-bang,

3

Le tue domande sembrano molto soggettive e dipendono fortemente da chi è il tuo target di riferimento.

Prendiamo la tua domanda di analisi font / ttf. Se stai pianificando che i modder aggiungano il loro carattere, probabilmente vorrai rendere il processo di importazione il minor numero possibile di passaggi. Se stai aggiungendo un sacco di caratteri / dimensioni di caratteri al gioco internamente, forse vuoi uno strumento un po 'sofisticato che un artista può usare con un po' di allenamento. Se lo farai una volta internamente, probabilmente il tempo impiegato per creare un vero importatore sarà inferiore al tempo impiegato a scrivere strumenti per i casi precedenti.

È davvero una questione di scala con tutto il resto. Gli strumenti incorporati valgono lo sforzo quando si fa qualcosa molte volte e si desidera ridurre la complessità / i bug che ne derivano. Ogni qualificatore aggiuntivo che aggiungi (ovvero solo texture TGA invece di importare, diciamo, PSD) comporta un maggiore tempo speso dall'utente finale.

Ricorda che gli strumenti di contenuto sono generalmente utilizzati da persone meno tecnicamente propense (leggi: artisti). Personalmente, mi piace molto il modo in cui Unity funziona dove puoi semplicemente trascinare un file sorgente (psd, 3ds, ttf, mp3, jpg, mov, qualunque cosa) e lo convertirà automaticamente nel suo formato interno. Il formato interno è per lo più nascosto all'utente finale. Si convertirà automaticamente anche quando rileverà la modifica del file di origine. Ma è un sacco di lavoro.

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.