Avertissement: tout ce qui suit n'est que mon opinion qui vaut ce qu'elle vaut, même quand j'ai l'air sûr de mon fait
.
Je ne crois pas que cela aie grand chose à voir avec une différence de performance entre un DelayCommand et l'utilisation du heartbeat. Tes deux "versions" n'ont pas du tout le même design d'après ce que je comprends, donc tu ne peut pas les comparer. Dans un cas, celui que tu utilises maintenant, si j'ai bien compris, tu signales la mort de chaque créature à ton Spawnmaster par un moyen ou par un autre (UdE ou simplement un SetLocal), et par le biais d'un seul Onheartbeat tu respawn les créatures. Dans l'autre cas le respawn des créatures est directement lié à leur onDeath je suppose. Ces deux design n'ont au fond rien à voir avec OnHeartbeat et Delaycommand, tu pourrais te passer totalement de l'OnHeartbeat dans le premier, en recréant les créatures quand un PJ entre dans la zône par exemple, et dans le deuxième cas tu pourrais te passer totalement du DelayCommand, en recréant les créatures immédiatement, ça n'est juste pas là même manière de faire.
Pour l'option 1, parcourir tous les objets d'une zone en Heartbeat, comme tu as l'air de le suggérer (mais je pense que je n'ai pas bien compris) me semble une très mauvaise idée.
D'ou l'idée m'est venu de passer aussi par des heartbeat, car le fait est que je parcour la zone, si c'est un item ou un placable de type sac de drop je les traite, si c'est un objet de type waypoint alors je regarde si c'est un waypoint de type respawn alors traitementq.
L'information que tu passe à la matrice lors du OnDeath (en fait quelle créature est morte tout simplement, et ce sous une forme ou une autre, par exemple un entier, en créant un pseudo tableau sur la matrice) doit te permettre de faire les respawns par elle même. Et encore une fois cela n'a rien à voir avec le OnHeartBeat, tu pourrais accrocher le script de respawn à n'importe quel événement.
Pour ce qui est de l'option 2, et de ton script en particulier,
Ton DelayCommand n'était pas du tout optimisé, comme le remarquait Jedaï, toutes ces variables sont copiées en mémoires:
oSpawnMaster; szMonsterTag; nLength; szSpawnPointTag; szSpawnPointInfo; szMonsterClass; oSpawnPoint; fSpawnTime; lSpawnPoint;
Quand tu fais un SetLocalString tu crées une
copie de la chaîne en mémoire, puis tu récupères un pointeur: si ton pointeur pointait n'importe où, ça te ferais une belle jambe de le récupérer. Je doute que SetLocalObject crée une copie de l'objet...
Par ailleurs si je peux me permettre quelques remarques d'ordre général, tout l'intérêt d'avoir une matrice comme le RespawnMaster que tu as créé est de minimiser la nécessité d'échanger, et d'aller pêcher (GetObjectByTag) des informations, tout ce qui est lieu de respawn, laps de temps avant le respawn, ResRef de la créature devrait être dans les scripts de la matrice et pas dans ceux de la créature... Et tu ne devrais avoir recours qu'à des OBJECT_SELF, ou des GetLocal...(OBJECT_SELF,...) pour récupérer les informations. Pour récupérer la matrice sur chaque créature, si tout ce qu'elle fait ce sont les respawns, tu ne peux pas vraiment optimiser, car il faudra de toute façon que tu ailles la chercher une fois par un GetObjectByTag(...). Mais quite à ce qu'elle les respawns elle devrait aussi les créer la première fois, auquel cas un simple:
object oCreature = CreateObject....
SetLocalObject(oCreature,"Mat", OBJECT_SELF);
Te permets d'avoir une référence directe à la matrice sur les créatures, c'est pas avec un SetLocalObject par créature que tu vas réussir à remplir ta mémoire... ce qui est important c'est le gain CPU je pense.
ensuite tu fais par exemple un
SignalEvent(GetLocalObject(OBJECT_SELF,"Mat"), EventUserDefined(nLeCodePourLaMortDeTaCréature));
Et tous le reste, y compris le DelayCommand, si c'est comme ça que tu veux faire, est dans l'UDE de la matrice, en toute lettre pour ce qui est des ResRef et autre truc du genre.
Pour le
Ce qui induit que cela bloque les respawn suivant dans la file si le précédent n'est pas fini. Donc en plus si ils n'ont pas la même durée de spawn ..
Comprend pas, de toutes façon un seul script est exécuté à la fois, ça n'a rien de spécifique au DelayCommand, ça ne bloque rien comme le prouve le fait que nwscript fonctionne, et je ne comprend pas ce que tu veux dire par "durée de spawn";