Con quale forza un motore per giocatore singolo dovrebbe rifiutare dati non validi?


11

In una partita a giocatore singolo, quando provi a costruire un'entità a partire da componenti specificati in script esterni, cosa pensi sia più desiderabile che accada quando uno dei componenti è mal formato:

  • Il motore dovrebbe saltare quel componente e far vivere l'entità nel mondo di gioco solo con i componenti che sono stati scritti bene?
  • O non dovrebbe affatto aggiungere l'entità al mondo se solo uno dei componenti è mal formato?

Nota, non sto parlando della registrazione degli errori - che dovrebbe venire senza dire - proprio di ciò che dovrebbe accadere all'entità.


Stiamo parlando di single-player o multi-player?
o0 '.

@Lohoris Giocatore singolo.
Paul Manta,

2
Come la maggior parte delle risposte ha già fatto allusione, chi è il tuo pubblico? Stai creando un gioco modificabile o stai parlando per scopi di sviluppo interno?
Tetrad,

@Tetrad Vorrei che il gioco fosse il più modesto possibile.
Paul Manta,

Risposte:


11

Se stai parlando di un gioco modificabile, allora potresti voler seguire uno dei tuoi suggerimenti sopra. Ma se sei preoccupato di ignorare i tuoi errori, direi di non farlo. Sono diventato un sostenitore di Fail-Fast . Se questo è un errore che hai creato e che devi risolvere prima di rilasciarlo, dovresti rendere evidente l'errore. L'articolo che è collegato in fondo alla pagina della wiki è una buona lettura sull'argomento del perché il fallimento veloce è buono e quando dovrebbe e non dovrebbe essere usato.


2
Penso che questa sia una grande dicotomia, differenziando tra errori dell'utente e errori dello sviluppatore. Ha senso per la stessa identica ragione per cui gli errori del compilatore sono generalmente abbastanza facili da correggere, ma gli errori di runtime / semantico sono il diavolo.
jhocking

Se il motore include un modo per modificare le entità una volta iniziato il gioco, dovresti almeno darti la possibilità di correggere l'errore prima di fallire.
Blecki,

7

La distinzione tra utente e sviluppatore non è sempre chiara nello sviluppo del gioco. Le tecniche di programmazione standard come "fail fast" non sono sempre vantaggiose, specialmente quando le dimensioni del team aumentano.

Ad esempio, forse il tuo artista tecnico ha rovinato lo shader per il contorno di targeting: abbiamo rotto il fallback, diciamo, quindi si sta caricando solo su sistemi SM4 e non se ne è accorto perché ha un sistema top di gamma. Ciò comporta il mancato caricamento di alcune animazioni. A quelle animazioni fa riferimento un particolare incantesimo scritto dal tuo progettista di combattimenti. Infine, la tua designer di livelli sta cercando di mettere in atto le spawn e quelle spawn sono tutte in grado di lanciare quell'incantesimo, ma ora non può posizionarne nessuno nel mondo perché i loro incantesimi non sono validi perché gli effetti non sono validi è valido perché gli shader non si caricano perché i progettisti hanno sempre i computer peggiori.

Quindi la tua demo non è pronta entro le 14:00 e i tuoi investitori si chiedono perché non puoi nemmeno avere un singolo nemico nel gioco e il tuo progetto viene chiuso.

Oppure scegli l'opzione in cui registrare l'errore ma continui a provare, e il gioco funziona bene tranne che alcuni effetti degli incantesimi dei nemici non compaiono - ma gli investitori non sanno comunque come dovrebbero apparire, quindi non lo fanno Avviso.

Per questo motivo, proporrò quasi sempre la prima opzione: generare l'entità quanto più possibile. Ci sono casi di fail-fast - come se i dati non dovessero mai essere modificati se non da persone in grado di fare build (es. Programmatori e produttori tecnici) e sono sempre controllati al 100% al carico, o se sei assolutamente sicuro della persona responsabile il problema è la persona che utilizza l'editor, ma quelli non sono i soliti casi e richiedono di per sé molte infrastrutture tecniche, sulle quali potresti non essere pronto a investire.


1
Vorrei pensare che lo scenario da te proposto possa essere prevenuto con buoni sistemi di controllo del codice sorgente. Nel tuo scenario, l'artista ha "rotto la build". Chiunque lavori con lo shader rotto dovrebbe essere in grado di riportare lo shader a una revisione precedente fino a quando il problema non è stato risolto.
John McDonald,

1
@John Sebbene sia necessario un buon controllo del codice sorgente, e talvolta è necessario un rollback per ripristinare il resto di un progetto in uno stato funzionante fino a quando un errore non viene risolto localmente, è raramente utile come meccanismo di prevenzione e non deve essere considerato come tale .

@Giovanni: su grandi progetti, le build possono richiedere ore (o un'intera giornata). Quindi in realtà hai bisogno di un approccio su due fronti: non hai bisogno solo del controllo del codice sorgente, ma del controllo binario, quindi un non programmatore può tornare a interi build precedenti. Ma ovviamente, questo ha i suoi rischi e costi, perché ora stai sviluppando nuovi contenuti rispetto ad altri contenuti non aggiornati, con eseguibili che potrebbero avere altri bug cattivi. E anche trovare la build giusta per il rollback potrebbe richiedere più di 30 minuti - se tutti i tuoi designer devono fermarsi per mezz'ora e giocherellare con le build, è un grande spreco di denaro.

@Joe Wreschnig: ha senso. Quindi immagino ci debba essere un punto in cui il fallimento veloce non è più un vantaggio. O nei tipi di persone che lo usano o su progetti di una certa dimensione. Suppongo che spetti alle persone del team decidere cosa funziona per loro.
John McDonald,

2
Non sono sicuro veloce duro riesco, che in realtà è ciò che la questione è di circa, è sempre un bene. Anche in una "squadra" di una sola persona, forse non voglio occuparmi del codice shader perché devo davvero fare questo livello. Certamente scrivo una buona gestione degli errori e registro tutti gli errori, ma ho quasi sempre un'idea migliore di ciò che è importante in questo momento in questo momento rispetto a quando ho scritto il codice di errore sei mesi fa.

1

L'utente dovrebbe essere in grado di visualizzare in anteprima l'entità che sta per importare e sapere in anticipo se ci sono errori.

Dovresti in qualche modo decidere quali errori dovrebbero essere fatali, impedendone l'aggiunta al gioco e quali possono essere respinti come avvertimenti .

Ovviamente se per qualsiasi motivo l'entità importata fosse in qualche modo in grado di modificare irreversibilmente i dati del savegame, è meglio che sia impeccabile.


0

Vorrei suggerire che in fase di sviluppo, dovrebbe essere rumoroso per i dati non validi. cioè registra tutto da qualche parte che verrà letto. Tuttavia, se il tuo motore può ignorarlo e continuare, dovrebbe farlo. Puoi avere la logica come

void setValue(int value) {
    if (value < MIN_VALUE) {
       log(value + " is too low, using " + MIN_VALUE);
       value = MIN_VALUE;
    }
    if (value > MAX_VALUE) {
       log(value + " is too high, using " + MAX_VALUE);
       value = MAX_VALUE;
    }
}

Anche in una partita a più giocatori questo è accettabile a meno che tu non stia supponendo che un giocatore stia cercando di imbrogliare il sistema.

Dopo aver rilasciato il software, è probabile che si desideri disattivare questa registrazione per impostazione predefinita nel presupposto che i giocatori non leggeranno questi registri.


Supponendo che i log non presentino alcun problema di prestazioni, è necessario continuare ad accedere nelle build di rilascio e inviare i report al team di sviluppo. (Informando opportunamente i giocatori, ovviamente.)

Dovresti essere in grado di registrare registri più concisi per il rilascio. Nello sviluppo puoi tendere ad essere più prolisso.
Peter Lawrey
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.