Architecture du moteur de jeu MVC (Model-View-Controller) - Oui ou non? [fermé]

18

Je lis un grand livre, Game Coding Complete , et ce livre recommande fortement d'utiliser l' approche MVC (Model-View-Controller) , avec trois couches clés:

  1. Couche d'application de jeu
  2. Game Logic
  3. Vue du jeu

Pour moi, cette approche ressemble à une surpuissance pour un jeu sur ordinateur mobile.

Quelle est votre opinion, s'il vous plaît? Vaut-il la peine de mettre en œuvre cette architecture, même si elle ajoute une communication supplémentaire nécessaire entre les modules? Cette conception peut-elle consommer autant de puissance CPU, qu'à la fin, le résultat serait considérablement plus lent que s'il n'était pas implémenté?

Bunkai.Satori
la source
5
-1 et vote pour clore. Tout ce qui mérite d'être dit sur MVC dans les jeux a été dit sur gamedev.stackexchange.com/questions/3426/… , et jusqu'à présent, tout ce que nous avons ici est des ordures.
@Joe Wreschnig c'est assez dur, mais je suppose que c'est vrai ...
Spooks
@chaos: En fait, j'ai voté pour votre réponse, mais nous n'avions vraiment pas besoin d'une autre réponse disant "utilisez des modèles s'ils aident, pas s'ils ne le font pas." Ou peut-être que nous l'avons fait, mais c'est encore très triste. Cependant, je ne sais toujours pas comment faire référence à des expressions telles que "conceptions d'exécution comme l'héritage" autres que les ordures.
2
@Joe: Oh, eh bien merci. :) L'argument selon lequel la POO est gratuite est quelque peu époustouflant. Je suppose que selon une certaine norme, nous ne devrions pas avoir besoin de réitérer des points comme le mien, mais les noobs se produisent et les doublons de façon discutable. Il a également pour fonction de laisser les retardataires sur le site comme moi gratter un tout petit peu de répétition malgré une activité massivement calmée. :) Je veux dire, putain, j'ai 40K rep sur SO, mais ici je ne peux même pas éditer un wiki de balises.
chaos

Réponses:

30

Je supporte quelque peu l'utilisation d'une structure MVC même pour un jeu mobile simple. À tout le moins, cela résout un problème qui tourmente les développeurs qui ne se sont pas fait mordre assez souvent: séparer le code d'affichage de la logique du jeu.

Je dirai également, cependant, de garder à l'esprit que MVC, comme tous les modèles de conception, existe pour vous faciliter la vie . Cela signifie que si, à un moment donné, le respect de certaines règles concernant ce que vous devez et ne devez pas faire lorsque vous utilisez MVC vous rend la vie plus difficile, ignorez-la . Deux choses se produiront: 1) vous serez mordu plus tard, puis vous comprendrez pourquoi le faire différemment en premier lieu vous aurait en fait rendu la vie plus facile à long terme, ou 2) aucune conséquence.

La programmation informatique, de par sa nature, attire de nombreux adeptes des règles qui apprécient le respect du principe élégant plutôt que d'accomplir quoi que ce soit, et ils aiment proposer leur système de valeurs; ne les laissez pas faire de vous l'un d'eux. La chose la plus importante qui puisse arriver à votre jeu est de l' expédier .

le chaos
la source
Cher Chaos, j'aime le plus votre réponse, donc je la marque comme une réponse à ma question. L'approche MVC ajoute l'abstraction à la conception du code. L'abstraction ajoute généralement des étapes supplémentaires de code, qui pourraient être évitées avec une conception plus directe. Comme je l'ai bien compris, je n'ai pas à me soucier du coût introduit par l'abstraction ajoutée à la suite de la conception MVC.
Bunkai.Satori,
1
Bonne réponse, +1 là-dessus. La théorie est très bien, mais cela peut empêcher les jeux d'être livrés si vous ne le faites pas.
James
@ Bunkai.Satori: Il ajoute de l'abstraction, et l'OMI est une abstraction utile qui paie son chemin. Je suis d' accord avec votre dernière déclaration, avec la clarification qu'il y a un coût, et que je ne pense pas que vous devez vous inquiétez pas à ce sujet.
chaos
4

Les conceptions de compilation ne consomment pas de puissance CPU, sauf si vous avez un compilateur incroyablement abyssal. Un langage ou une approche orientée objet n'est pas différent dans ses caractéristiques de performance d'un langage procédural. Vous n'invoquerez aucune surcharge supplémentaire pour l'utilisation de MVC. La modularité existe au moment de la compilation, pas à l'exécution, une fois que le code est en ligne et optimisé, cela ne fera aucune différence.

De nombreux jeux modernes exécutent en fait les modèles et les vues sur des threads séparés et bénéficient de grands avantages en termes de performances sur la plupart des plates-formes.

En fin de compte, MVC est une bonne conception qui vous offre une maintenance accrue et moins de bugs, etc. gratuitement . Il n'y a aucune raison de ne pas l'utiliser. C'est comme demander pourquoi vous devriez utiliser une forboucle au lieu de gotos manuscrits . À moins que vous n'ayez un design supérieur à l'esprit, c'est certainement mieux que rien.

Edit: les conceptions de compilation ne consomment pas de puissance CPU. Les conceptions d'exécution comme l'héritage le font évidemment.

DeadMG
la source
-1. MVC est une décision au moment de la conception. L'héritage est une décision au moment du design. Les deux se produisent avant la compilation et l'exécution. Les deux ont des impacts majeurs sur les performances. L'intégration n'accélère pas toujours le code. Votre proposition de discussion est incroyablement naïve. Rien n'est gratuit.
Merci DeadMG pour votre réponse. Fondamentalement, je veux dire qu'à chaque niveau d'abstraction, le code devient plus lent, à mesure que de plus en plus d'étapes intermédiaires sont ajoutées. MVC est une conception plus abstraite, qui entraînera très probablement plus d'étapes pour réaliser la même tâche. Cela aurait une influence sur la vitesse, imo.
Bunkai.Satori
4

Il y a presque toujours un compromis entre la clarté du code et les exigences techniques (vitesse, mémoire, etc.) du programme. Les langages orientés objet ont un surcoût par rapport aux langages procéduraux, mais ils se sont avérés avoir de nombreux avantages par rapport aux langages procéduraux, en particulier dans la maintenance à long terme du code (bogues, etc.) et souvent aussi la vitesse de développement.

Donc, avec cela à l'esprit, je propose que MVC mérite d'être implémenté pour vous en tant que programmeur de jeux . Votre code suivra mieux les principes orientés objet, en particulier l' encapsulation , et vous aurez probablement beaucoup plus de facilité à le maintenir (correction de bugs ou ajout de nouvelles fonctionnalités).

D'un autre côté, assurez-vous de terminer un jeu et de ne pas consacrer autant de temps au "moteur" qu'il ne sera jamais fait.

Pour plus d'informations, veuillez lire la question "Pourquoi MVC et TDD ne sont-ils pas davantage employés dans l'architecture de jeu?" et ma très longue réponse.

Ricket
la source
1
Les langages OO ne sont pas du tout plus lents que les langages procéduraux. Si vous écrivez du code en C ++ qui fait du décalage de bits, il ne sera pas plus lent qu'en C. Un langage ou un programme n'est pas plus lent que procédural du tout simplement parce qu'il est orienté objet. Les programmes ne présentent que des inconvénients de performances car ils sont mal écrits . En conséquence, je ressens le besoin de voter contre votre réponse.
DeadMG
Salut Ricket, merci pour ton explication. Cela semble très logique. DeadMG, eh bien, d'un côté vous avez raison, de l'autre côté, je pense que l'approche OO ajoute plus de bits d'informations dans le code compilé que le langage procédural. Ces bits supplémentaires de code lié à OO ralentissent le code résultant. Êtes-vous d'accord?
Bunkai.Satori,
3
Whoa now ... Bien sûr, une simple ligne en C ++ comme a++sera exactement la même qu'en a++C (où aest un type primitif, etc. etc.). Mais considérons une classe C ++ simple avec une fonction virtuelle qui fait quelque chose, cette fonction virtuelle encourant une surcharge lourde par rapport à une simple fonction C, même si le code interne est identique. Les langages orientés objet ont une surcharge . Désolé d'avoir dit explicitement "vitesse". Si des allocations de mémoire supplémentaires et autres n'aboutissent pas à un programme plus lent, vous avez tout à fait raison.
Ricket
2
Si la fonction est virtuelle, cela implique que le programme doit choisir entre 2 versions différentes de la même fonction au moment de l'exécution. (Sinon, vous ne le rendriez pas virtuel.) Dans ce cas, vous avez de toute façon un niveau d'indirectionnel ou conditionnel supplémentaire, que vous devrez implémenter vous-même dans un langage procédural (par exemple via un pointeur de fonction ou une instruction switch) . Ce n'est pas des frais généraux - c'est intrinsèque au problème.
Kylotan