Dans les quêtes :
Si ici on prends une quête du jeu au hasard (ex VUltraLuxeSecurity) et qu'on regarde ce qu'il y a dessus

On remarque qu'il y a un script attaché à cette quête (VUltraLuxeSecuritySCRIPT), cette quête n'est pas active par défaut et doit être activée par quelque chose pour que le script démarre (un autre script par exemple).
Lorsqu'elle sera active, le script qui lui est associé se lancera toutes les 10 secondes (configuré via le Script Processing Delay, si la case est cochée il ignorera la valeur dans la case "Default" et sera configuré sur 5 secondes).
Donc ensuite si on jette un œil au script :

Toutes les 10 secondes il exécutera le code contenu dans le script depuis le début. C'est comme si le script était lui-même imbriqué dans une boucle "While (1)" avec tous les autres script du jeu. Quand le moteur du jeu arrive sur le script, qu'il voit que le délai du "Script Processing Delay" a expiré, il exécute le script et réinitialise la valeur du "Script Processing Delay" pour une prochaine itération.
Je ne sais pas exactement comment fonctionne le moteur de jeu, mais j'ai l'impression qu'on peut le voir de la manière suivante (c'est sûrement pas écrit comme ça dans le moteur de jeu mais c'est juste pour donner une vague idée de comment ça semble fonctionner) :
Code : Tout sélectionner
while (1){
if (IDQuest1.isActive AND IDQuest1.ScriptProcessingDelayElapsed)
RunScript IDQuest1.Script
endif
if (IDQuest2.isActive AND IDQuest2.ScriptProcessingDelayElapsed)
RunScript IDQuest2.Script
endif
if (IDQuest3.isActive AND IDQuest3.ScriptProcessingDelayElapsed)
RunScript IDQuest3.Script
endif
if (IDQuest4.isActive AND IDQuest4.ScriptProcessingDelayElapsed)
RunScript IDQuest4.Script
endif
; etc etc
; .
; .
; .
; .
; .
; .
; .
; .
if (IDQuest3690.isActive AND IDQuest3690.ScriptProcessingDelayElapsed)
RunScript IDQuest3690.Script
endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Le script en question ;;;;;;;;;;;;;;;;;;;;;;
; if (VUltraLuxeSecurity.isActive AND VUltraLuxeSecurity.ScriptProcessingDelayElapsed) ;
; RunScript VUltraLuxeSecuritySCRIPT ;
; endif ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (IDQuest3692.isActive AND IDQuest3692.ScriptProcessingDelayElapsed)
RunScript IDQuest3692.Script
endif
; .
; .
; .
; .
; .
}
C'est évidemment n'importe quoi ce que j'ai écrit au dessus, mais c'est juste pour dire que derrière le script il y a un traitement qui se fait avec des délais de traitement, des priorités, des interruptions...
Plus il y a de scripts avec des fréquences de réitération élevée et plus ça bouffe en ressource. Non seulement ça risque de faire "galérer" le jeu sur des petites machines mais en plus s'il y a pleins de scripts à gérer au moment de l'appui de la touche je risque de passer à côté (c.-à-d. que le joueur appuie et relâche la touche sans que mon script ait pu être exécuté par le moteur de jeu à ce moment-là.
Si j'arrive à passer par les events, j'y gagnerai sur tous les terrains (performance et efficacité).
Le grand Geckwiki a écrit :SetEventHandler
Description
Registers a User-Defined Function (UDF) as an Event Handler for the specified event.
This means that whenever the specified event occurs in-game, if a UDF was set as an Event Handler for that event, the UDF's script will run, allowing for instant reactions to certain events.