Avec quelle force un moteur solo devrait-il rejeter des données invalides?

11

Dans un jeu solo, lorsque vous essayez de créer une entité à partir de composants spécifiés dans des scripts externes, que pensez-vous qu'il est plus souhaitable de se produire lorsque l'un des composants est mal formé:

  • Le moteur doit-il ignorer ce composant et laisser l'entité vivre dans le monde du jeu avec uniquement les composants qui ont été bien écrits?
  • Ou ne devrait-elle pas du tout ajouter l'entité au monde si un seul des composants est mal formé?

Remarque, je ne parle pas de consigner les erreurs - cela devrait venir sans dire - juste ce qui devrait arriver à l'entité.

Paul Manta
la source
Parle-t-on solo ou multi-joueurs?
o0 '.
@Lohoris Solo.
Paul Manta
2
Comme la plupart des réponses ont déjà fait allusion, qui est votre public? Faites-vous un jeu modifiable ou parlez-vous à des fins de développement interne?
Tetrad
@Tetrad J'aimerais que le jeu soit aussi convivial que possible pour le modder.
Paul Manta

Réponses:

11

Si vous parlez d'un jeu modifiable, vous voudrez peut-être suivre l'une de vos suggestions ci-dessus. Mais si vous êtes soucieux de reconduire vos propres erreurs, je dirais de ne pas le faire. Je suis devenu un défenseur de Fail-Fast . S'il s'agit d'une erreur que vous avez créée et que vous devez résoudre avant de la publier, vous devez rendre l'erreur évidente. L'article qui est lié au bas de la page wiki est une bonne lecture sur le sujet avec pourquoi échouer rapidement est bon, et quand il devrait et ne devrait pas être utilisé.

John McDonald
la source
2
Je pense que c'est une grande dichotomie, faisant la différence entre les erreurs utilisateur et les erreurs développeur. Il est logique pour la même raison que les erreurs du compilateur sont généralement assez faciles à corriger, mais les erreurs d'exécution / sémantiques sont le diable.
jhocking
Si le moteur comprend un moyen de modifier les entités une fois le jeu démarré, vous devriez au moins vous donner la possibilité de corriger l'erreur avant d'échouer.
Blecki
7

La distinction entre utilisateur et développeur n'est pas toujours claire dans le développement de jeux. Les techniques de programmation standard comme «échouer rapidement» ne sont pas toujours avantageuses, en particulier lorsque la taille des équipes augmente.

Par exemple, votre artiste technique a peut-être foiré le shader pour le contour de ciblage - a rompu le repli, disons, donc il ne se charge que sur les systèmes SM4, et il ne l'a pas remarqué parce qu'il a un système haut de gamme. Cela entraîne le chargement de certaines animations. Ces animations sont référencées par un sort particulier que votre concepteur de combat a écrit. Enfin, votre concepteur de niveaux essaie de mettre en place les apparitions et ces apparitions sont toutes capables de lancer ce sort - mais maintenant elle ne peut en placer aucun dans le monde parce que leurs sorts ne sont pas valides car les effets ne sont pas n'est pas valable car les shaders ne se chargent pas car les concepteurs ont toujours les pires ordinateurs.

Donc, votre démo n'est pas prête à 14 heures et vos investisseurs se demandent pourquoi vous ne pouvez même pas avoir un seul ennemi dans le jeu et votre projet est arrêté.

Ou vous choisissez l'option où vous enregistrez l'échec mais continuez à essayer, et le jeu se déroule bien sauf que certains effets de sorts ennemis n'apparaissent pas - mais les investisseurs ne savent pas à quoi ils doivent ressembler de toute façon, donc ils ne le font pas remarquer.

Pour cette raison, je préconiserai presque toujours la première option - générer autant d'entités que possible. Il existe des cas d'échec rapide - comme si les données ne devaient jamais être éditées, sauf par des personnes capables de faire des builds (c'est-à-dire des programmeurs et des producteurs techniques) et étaient toujours vérifiées à 100% à la charge, ou si vous êtes absolument sûr que la personne responsable de le problème est la personne qui utilise l'éditeur - mais ce ne sont pas les cas habituels, et nécessitent beaucoup d'infrastructure technique en soi, dans laquelle vous pourriez ne pas être prêt à investir.

cendres999
la source
1
J'aimerais penser que le scénario que vous proposez peut être évité avec de bons systèmes de contrôle des sources. Dans votre scénario, l'artiste a «cassé la construction». Toute autre personne travaillant avec le shader cassé doit pouvoir restaurer le shader dans une révision antérieure jusqu'à ce que le problème soit résolu.
John McDonald,
1
@John Bien qu'un bon contrôle des sources soit indispensable, et parfois une restauration est nécessaire pour restaurer le reste d'un projet dans un état de fonctionnement jusqu'à ce qu'un échec soit résolu localement, il est rarement utile comme mécanisme de prévention et ne doit pas être utilisé comme tel .
@John: Sur les grands projets, les builds peuvent prendre des heures (ou une journée entière). Vous avez donc réellement besoin d'une approche à deux volets - vous avez besoin non seulement du contrôle des sources, mais du contrôle binaire, afin qu'un non-programmeur puisse revenir à des versions précédentes entières. Mais bien sûr, cela a ses propres risques et coûts, car vous développez maintenant de nouveaux contenus contre d' autres contenus obsolètes, avec des exécutables qui pourraient avoir d' autres mauvais bugs. Et même trouver le bon build pour revenir en arrière pourrait prendre plus de 30 minutes - si vos concepteurs doivent tous s'arrêter pendant une demi-heure et jouer avec les builds, c'est beaucoup d'argent gaspillé.
@Joe Wreschnig: Cela a du sens. Je suppose donc qu'il doit y avoir un moment où l'échec rapide n'est plus un atout. Soit dans les types de personnes qui l'utilisent, soit sur des projets d'une certaine taille. Je suppose que c'est aux membres de l'équipe de décider ce qui fonctionne pour eux.
John McDonald,
2
Je ne suis pas sûr rapide dur échoue, ce qui est vraiment ce que la question concerne, est toujours un atout. Même sur une seule "équipe" de personne, peut-être que je ne veux pas m'occuper du code du shader parce que je dois vraiment faire ce niveau. Certes, écrivez une bonne gestion des erreurs et enregistrez toutes les erreurs, mais j'ai presque toujours une meilleure idée de ce qui est important en ce moment en ce moment que lorsque j'ai écrit le code d'erreur il y a six mois.
1

L'utilisateur doit pouvoir prévisualiser l'entité qu'il va importer et savoir à l'avance s'il y a des erreurs.

Vous devez en quelque sorte décider quelles erreurs doivent être fatales, en empêchant qu'elles soient ajoutées au jeu et qui peuvent être rejetées en tant qu'avertissements .

Bien sûr, si pour une raison quelconque, l'entité importée est en mesure de modifier de manière irréversible les données de sauvegarde, vous feriez mieux de l'exiger sans défaut.

o0 '.
la source
0

Je dirais qu'en cours de développement, cela devrait être bruyant sur les données invalides. c'est-à-dire, enregistrez tout quelque part, il sera lu. Cependant, si votre moteur peut ignorer cela et continuer, il doit le faire. Vous pouvez avoir une logique comme

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;
    }
}

Même dans une partie multi-joueurs, cela est acceptable à moins que vous ne supposiez qu'un seul joueur essaie de tromper le système.

Après avoir publié le logiciel, vous souhaiterez probablement désactiver cette journalisation par défaut en supposant que les joueurs ne liront pas ces journaux.

Peter Lawrey
la source
En supposant que les journaux ne présentent aucun problème de performances, vous devez continuer à vous connecter aux versions et renvoyer les rapports à l'équipe de développement. (Bien informer les joueurs, bien sûr.)
Vous devriez pouvoir enregistrer des journaux plus concis pour publication. En développement, vous pouvez avoir tendance à être plus verbeux.
Peter Lawrey