(Vous voudrez peut-être connaître le terme "correction de singe" ou "frappe de canard" si ce n'est que pour l'image mentale humoristique.)
Cela dit: si votre objectif est de réduire le temps d’itération pour les changements de «comportement», essayez des approches qui vous mèneront presque jusqu'au bout, et combinez-les pour en permettre davantage à l’avenir.
(Cela sera un peu tangent, mais je vous promets que ça reviendra!)
- Commencez par les données et commencez petit: rechargez aux limites ("niveaux" ou autres), puis utilisez les fonctionnalités du système d'exploitation pour obtenir des notifications de modification de fichier ou interrogez-les simplement régulièrement.
- (Pour les points bonus et les temps de chargement réduits (encore une fois, temps d'itération décroissant), examinez la cuisson des données .)
- Les scripts sont des données et vous permettent d'itérer le comportement. Si vous utilisez un langage de script, vous avez maintenant la possibilité de recharger ces scripts, interprétés ou compilés. Vous pouvez également connecter votre interprète à une console de jeu, à une prise réseau ou similaire, pour une flexibilité accrue lors de l'exécution.
- Le code peut aussi être une donnée : votre compilateur peut prendre en charge les superpositions , les bibliothèques partagées, les DLL, etc. Vous pouvez donc maintenant choisir un moment "sûr" pour décharger et recharger une superposition ou une DLL, qu'elle soit manuelle ou automatique. Les autres réponses vont dans les détails ici. Notez que certaines variantes de ce type peuvent perturber la vérification de signature cryptographique, le bit NX (non-exécution) ou des mécanismes de sécurité similaires.
- Envisagez un système de sauvegarde / chargement versionné en profondeur, avec versions . Si vous pouvez enregistrer et restaurer votre état de manière robuste, même en cas de changement de code, vous pouvez arrêter votre jeu et le redémarrer avec une nouvelle logique exactement au même endroit. Plus facile à dire qu'à faire, mais c'est faisable, et c'est nettement plus facile et plus portable que de fouiller la mémoire pour changer les instructions.
- Selon la structure et le déterminisme de votre jeu, vous pourrez peut-être enregistrer et lire . Si cet enregistrement est juste au-dessus des "commandes de jeu" (pensez à un jeu de cartes, par exemple), vous pouvez modifier tout le code de rendu souhaité et rejouer l'enregistrement pour voir vos modifications. Pour certains jeux, cela est aussi "facile" que d'enregistrer des paramètres de départ (par exemple, une graine aléatoire) puis des actions de l'utilisateur. Pour certains, c'est beaucoup plus compliqué.
- Faire des efforts pour réduire le temps de compilation . En combinaison avec les systèmes de sauvegarde / chargement ou d'enregistrement / lecture susmentionnés, ou même avec des superpositions ou des DLL, cela peut réduire votre délai d'exécution plus que toute autre chose.
Bon nombre de ces points sont utiles même si vous ne parvenez pas à recharger des données ou du code.
Anecdotes à l'appui:
Sur un grand PC RTS (environ 120 personnes, principalement C ++), il existait un système extrêmement puissant de sauvegarde d'état, utilisé à au moins trois fins:
- Une sauvegarde "peu profonde" a été alimentée non pas sur disque, mais sur un moteur CRC, afin de garantir que les parties multijoueurs restent en simulation avec un pas de contrôle complet un CRC toutes les 10-30 images; cela a permis à personne de tricher et d'attraper des bogues désynchrones quelques images plus tard
- Si et quand un bogue de désynchronisation multijoueur se produisait, une sauvegarde très profonde était effectuée à chaque image, puis de nouveau transmise au moteur CRC, mais cette fois, le moteur CRC générait de nombreux CRC, chacun pour des lots d'octets plus petits. De cette manière, il pourrait vous dire exactement quelle partie de l'état a commencé à diverger dans la dernière image. Nous avons détecté une vilaine différence en "mode virgule flottante par défaut" entre les processeurs AMD et Intel utilisant cette méthode.
- Une sauvegarde de profondeur normale pourrait ne pas enregistrer, par exemple, l'image exacte de l'animation jouée par votre unité, mais elle obtiendrait la position, la santé, etc. de toutes vos unités, vous permettant ainsi de sauvegarder et de reprendre à tout moment pendant le jeu.
Depuis, j'ai utilisé l'enregistrement / la lecture déterministe sur un jeu de cartes C ++ et Lua pour la DS. Nous nous sommes connectés à l'API que nous avons conçue pour l'IA (côté C ++) et avons enregistré toutes les actions de l'utilisateur et de l'IA. Nous avons utilisé cette fonctionnalité dans le jeu (pour rediffuser le joueur), mais aussi pour diagnostiquer les problèmes: en cas de crash ou de comportement étrange, il suffisait de récupérer le fichier de sauvegarde et de le lire dans une version de débogage.
Depuis lors, j'ai également utilisé plus de quelques fois les incrustations, et nous les avons combinées avec notre système de "parcourir automatiquement ce répertoire et de télécharger du nouveau contenu sur le terminal". Tout ce que nous aurions à faire, c’est de quitter la cinématique / niveau / peu importe et de revenir, et non seulement les nouvelles données (images-objets, agencement de niveaux, etc.) seraient chargées, mais également tout nouveau code inséré dans la superposition. Malheureusement, cela devient beaucoup plus difficile avec les ordinateurs de poche les plus récents en raison de la protection contre la copie et des mécanismes anti-piratage qui traitent spécialement le code. Nous le faisons toujours pour les scripts Lua cependant.
Dernier point mais non le moindre: vous pouvez (et j'ai, dans de très petites circonstances spécifiques) faire un peu de frappe de canard en corrigeant directement les codes d'opération d'instructions. Cela fonctionne mieux si vous êtes sur une plate-forme fixe et un compilateur, et parce que c'est presque impossible à maintenir, très sujet aux bogues et limité dans ce que vous pouvez accomplir rapidement, je ne l'utilise surtout que pour réacheminer le code pendant le débogage. Il ne vous enseigner un enfer beaucoup sur votre architecture de jeu d'instructions pressé, cependant.