Ordre d'évaluation


Lorsque vous programmez votre jeu en utilisant GML, vous devez savoir que les arguments d'appel de fonction ne sont pas garantis par un ordre d'évaluation. Cela signifie que l'ordre dans lequel vous placez les fonctions dans votre code changera d'une plate-forme à l'autre, vous devez donc les coder de manière explicite. Cela est dû aux différences d'optimisation entre les différentes plates-formes cibles, par exemple sur les fonctions cibles de Windows peuvent être évalués de droite à gauche, mais sur la cible HTML5, ils peuvent être évalués de gauche à droite. Donc, pour éviter les problèmes, il est préférable de ne pas appeler plusieurs fonctions dans les arguments d'un appel de fonction, car vous pourriez être en train de construire en fonction de l'ordre d'évaluation.

Pour voir un exemple de ce que cela signifie, considérez le code suivant qui appelle plusieurs fonctions et les utilise comme arguments pour un script:

buffer_seek(buff, buffer_seek_start, 0);
scr_buffer_get_info(buffer_read(buff, buffer_s8), buffer_read(buff, buffer_s16),buffer_read(buff, buffer_s16));

Maintenant, le problème ici est que sur certaines plates-formes, le dernier buffer_read sera appelé en premier, et donc tous les arguments du script seront faux car les données sont lues dans le tampon dans l'ordre "inverse" comme vous le percevriez. Cela a l'effet d'affecter ici toutes les autres valeurs pour le buffer_read fonctionne donc tous les arguments passés à ce script seront faux!

Pour contourner cela, vous devez appeler explicitement les fonctions dans l'ordre requis et stocker les valeurs renvoyées dans les variables, comme ceci:

var val[0] = buffer_read(buff, buffer_s8);
var val[1] = buffer_read(buff, buffer_s16);
var val[2] = buffer_read(buff, buffer_s16);
scr_buffer_get_info(val[0], val[1], val[2]);

Bien que cela puisse sembler une méthode plus verbeuse, elle garde tout clair et évite tout problème possible avec l'ordre d'évaluation.

Vous devez également faire attention lorsque vous utilisez des expressions, car l'ordre dans lequel elles sont évaluées changera en fonction de la cible à laquelle vous compilez. Ainsi, lorsque vous utilisez des expressions dans votre code, assurez-vous d'utiliser brackets () pour contrôler correctement l'ordre des opérations. Ceci est très important pour garantir le bon comportement de vos jeux sur tous les jeux de plates-formes cibles et est essentiel pour les plates-formes JavaScript. Par exemple, considérez le code suivant:

a = b == c || d;

Les différents compilateurs cibles effectueront les opérations dans des ordres différents puisqu'ils ne sont pas explicitement montrés, donnant lieu à des résultats "bizarres" auxquels vous ne pouvez pas vous attendre lorsque vous jouez à votre jeu. Pour éviter cela, utilisez le signe () pour séparer les parties, comme ceci:

a = (b == c || d);   //better
a = ((b == c) || d); //best