Architettura del motore di gioco MVC (Model-View-Controller) - Sì o No? [chiuso]


18

Sto leggendo un grande libro, Game Coding Complete , e quel libro raccomanda vivamente di utilizzare l' approccio MVC (Model-View-Controller) , con tre livelli chiave:

  1. Livello di applicazione del gioco
  2. Logica di gioco
  3. Vista di gioco

Per me, questo approccio sembra eccessivo per un gioco per computer portatile.

Qual è la tua opinione, per favore? Vale la pena implementare questa architettura, anche se aggiunge ulteriore comunicazione necessaria tra i moduli? Questo design può consumare così tanta potenza della CPU, che alla fine il risultato sarebbe significativamente più lento, se non fosse implementato?


5
-1 e vota per chiudere. Tutto ciò che vale la pena dire di MVC nei giochi è stato detto su gamedev.stackexchange.com/questions/3426/… , e finora tutto ciò che abbiamo qui è spazzatura.

@Joe Wreschnig è piuttosto duro, ma credo sia vero ...
Spooks

@chaos: In realtà, ho votato la tua risposta, ma in realtà non avevamo bisogno di un'altra risposta che dicesse "usa schemi se aiutano, no se non lo fanno". O forse l'abbiamo fatto, ma poi è ancora molto triste. Tuttavia, non so ancora come fare riferimento a espressioni come "Disegni run-time come ereditarietà" diversi dall'immondizia.

2
@Joe: Oh, bene grazie. :) L'argomento secondo cui OOP è gratuito non fa che confondere la mente. Immagino che per alcuni standard non dovremmo aver bisogno di punti come il mio ripetuto, ma ci sono dei rumori e così doppiano in modo discutibile domande. Serve anche a permettere ai ritardatari del sito come me di radunare un po 'di rappresentante nonostante l'attività sia stata massicciamente decaduta. :) Voglio dire, accidenti, ho un rappresentante di 40K su SO, ma qui non riesco nemmeno a modificare un tag wiki.
caos,

Risposte:


30

Sostengo in qualche modo l'utilizzo di una struttura MVC anche per un semplice gioco mobile. Se non altro, aiuta con un problema che affligge gli sviluppatori che non sono stati morsi abbastanza da esso: separare il codice di visualizzazione dalla logica di gioco.

Dirò anche, tuttavia, di tenere presente che MVC, come tutti i modelli di progettazione, esiste per semplificarti la vita . Ciò significa che se, in un dato momento, rispettare alcune regole su ciò che si dovrebbe e non si dovrebbe fare quando si utilizza MVC rende la vita più difficile, ignorarlo . Accadrà una di queste due cose: 1) verrai morso più tardi, e poi capirai perché farlo in modo diverso in primo luogo avrebbe effettivamente reso la tua vita più facile a lungo termine, o 2) nessuna conseguenza di sorta.

La programmazione informatica, per sua natura, ha molti seguaci della regola che apprezzano l'aderenza al principio elegante rispetto al realizzare effettivamente qualsiasi cosa, e adorano proporre il loro sistema di valori; non lasciare che ti rendano uno di loro. La cosa più importante che può accadere al tuo gioco è spedirlo .


Caro caos, mi piace di più la tua risposta, quindi la segnerò come risposta alla mia domanda. L'approccio MVC aggiunge l'astrazione nella progettazione del codice. L'astrazione di solito aggiunge ulteriori passaggi di codice, che potrebbero essere evitati con un design più diretto. Come ho capito bene, non ho bisogno di preoccuparmi del costo introdotto dall'astrazione aggiunta a seguito della progettazione MVC.
Bunkai.Satori,

1
Buona risposta, +1 su questo. La teoria va bene e va bene, ma può causare la mancata spedizione dei giochi se non lo fai.
James,

@ Bunkai.Satori: aggiunge astrazione e IMO è un'astrazione utile che si fa strada. Sono d'accordo con la tua ultima affermazione, con la precisazione che non v'è un costo, e che non credo che avete bisogno di preoccuparsi a questo proposito.
caos,

4

I progetti in fase di compilazione non consumano potenza della CPU, a meno che non si disponga di un compilatore incredibilmente abissale. Un linguaggio o un approccio orientati agli oggetti non differiscono in termini di prestazioni rispetto a quelli procedurali. Non invocherai alcun sovraccarico aggiuntivo per l'utilizzo di MVC. La modularità esiste in fase di compilazione, non in fase di esecuzione, una volta che il codice è integrato e ottimizzato, non farà alcuna differenza.

Molti giochi moderni eseguono effettivamente i modelli e le visualizzazioni su thread separati e ottengono grandi vantaggi in termini di prestazioni sulla maggior parte delle piattaforme.

In definitiva, MVC è un buon design che ti offre una maggiore manutenzione e meno bug ecc . Gratuitamente . Non c'è motivo di non usarlo. È come chiedere perché dovresti usare un forciclo invece di gotos scritti a mano . A meno che tu non abbia in mente un design superiore, è sicuramente meglio di niente.

Modifica: i progetti in fase di compilazione non consumano la CPU. Ovviamente i progetti run-time come l'ereditarietà lo fanno.


-1. MVC è una decisione in fase di progettazione. L'ereditarietà è una decisione in fase di progettazione. Entrambi si verificano prima del tempo di compilazione e di runtime. Entrambi hanno un grande impatto sulle prestazioni. Inline non sempre rende il codice più veloce. La tua proposta di threading è incredibilmente ingenua. Niente è gratis.

Grazie DeadMG per la tua risposta. Fondamentalmente, intendo che ad ogni livello di astrazione, il codice diventa slover, poiché vengono aggiunti sempre più passaggi intermedi. MVC è un design più astratto, che molto probabilmente porterà a più passaggi per raggiungere lo stesso compito. Ciò avrebbe influenza sulla velocità, imo.
Bunkai.Satori,

4

C'è quasi sempre un compromesso tra la chiarezza del codice e i requisiti tecnici (velocità, memoria, ecc.) Del programma. I linguaggi orientati agli oggetti hanno un sovraccarico rispetto ai linguaggi procedurali, ma hanno dimostrato di avere molti vantaggi rispetto ai linguaggi procedurali, specialmente nella manutenzione a lungo termine del codice (bug, ecc.) E spesso anche nella velocità di sviluppo.

Quindi, con questo in mente, propongo che MVC meriti di essere implementato per il tuo bene come programmatore di giochi . Il tuo codice seguirà meglio i principi orientati agli oggetti, in particolare l' incapsulamento , e probabilmente avrai un tempo molto più facile per mantenerlo (correggere i bug o aggiungere nuove funzionalità).

D'altra parte, assicurati di finire effettivamente una partita e di non passare così tanto tempo a lavorare sul "motore" che non viene mai eseguito.

Per maggiori informazioni, leggi la domanda "Perché MVC e TDD non sono più impiegati nell'architettura di gioco?" e la mia risposta davvero lunga.


1
Le lingue OO non sono affatto più lente delle lingue procedurali. Se scrivi del codice in C ++ che fa lo spostamento dei bit, non sarà più lento che in C. Un linguaggio o un programma non è più lento rispetto a quello procedurale solo perché è orientato agli oggetti. I programmi mostrano solo un peggioramento delle prestazioni perché sono scritti male . Di conseguenza, sento la necessità di sottovalutare la tua risposta.
DeadMG

Ciao Ricket, grazie per la tua spiegazione. Sembra molto logico. DeadMG, beh, da un lato hai ragione, dall'altro, penso che l'approccio OO aggiunga più bit di informazioni nel codice compilato rispetto al linguaggio procedurale. Questi bit extra di codice relativo a OO rendono più lento il codice risultante. Sei d'accordo?
Bunkai.Satori,

3
Whoa now ... Sicuramente una linea semplice in C ++ a++sarà esattamente la stessa a++di C (dove aè un tipo primitivo, ecc. Ecc.). Ma considera una semplice classe C ++ con una funzione virtuale che fa qualcosa, quella funzione virtuale comporta un pesante overhead rispetto a una semplice funzione C, anche se il codice interno è identico. I linguaggi orientati agli oggetti hanno un sovraccarico . Ci scusiamo per aver detto esplicitamente "velocità". Se allocazioni di memoria extra e simili non comportano un programma più lento, allora hai assolutamente ragione.
Ricket,

2
Se la funzione è virtuale, ciò implica che il programma deve scegliere tra 2 diverse versioni della stessa funzione in fase di esecuzione. (Altrimenti, non lo renderesti virtuale.) In questo caso, hai comunque un ulteriore condizionale o livello di indiretto, che dovresti implementare in un linguaggio procedurale (ad es. Tramite un puntatore a funzione o un'istruzione switch) . Non è un problema, è intrinseco al problema.
Kylotan,
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.