Si vous avez recommencé souvent ne nouvelle partie, il ne vous a pas échappé que le jeu fonctionne toujours beaucoup mieux en début de partie que lorsque vous avez accumulé des centaines d'heures dans votre sauvegarde. Plus celle-ci grossit, plus le jeu risque de moins bien fonctionner. Vous avez imputé cela au fait que vous installez et désinstallez beaucoup de mods, ce qui rend bien évidemment le jeu de plus en plus instable et sujet aux CTD. Et si le problème venait surtout du fait de l'accumulation des "poignées de référence" inscrites dans votre fichier de sauvegarde ?
Skyrim SSE intègre deux types de poignées de référence (reference handles) : temporaires et persistantes. Les handles temporaires sont chargés en mémoire, et deviennent donc actifs, uniquement lorsque le joueur se trouve sur sa grille, et sont déchargés lorsque le joueur quitte sa grille. Les handles persistants sont chargés au démarrage et conservés en mémoire en permanence.
Cependant, ceci n'est vrai que pour les plugins marqués comme ESM (maître). Pour tous les ESPs, les handles temporaires et persistants sont toujours conservés en mémoire. Skyrim SSE a un plafond inhérent de 1048576 handles de référence simultanés, d'où la nécessité d'ESMifier les gros plugins dans les grosses listes de mods installés.
Références persistantes et temporaires
Si vous avez déjà parcouru vos plugins dans xEdit, vous avez probablement remarqué que les cellules contiennent des objets persistants et temporaires.
Une référence est soit temporaire, ce qui signifie qu'elle n'est chargée que si elle se trouve dans la grille entourant le joueur, soit persistante, ce qui signifie qu'elle est toujours chargée en mémoire à tout moment.
La façon dont le moteur gère cela en interne est assez simple : toutes les références persistantes sont chargées en mémoire avant même que vous n'atteigniez le menu principal, et les références temporaires sont chargées à la demande depuis vos fichiers si nécessaire (par exemple, si une cellule devient active, toutes ses références temporaires seront chargées). La majorité de ces références temporaires seront ensuite déchargées lorsqu'elles ne seront plus nécessaires au jeu.
Limite des poignées de référence (reference handles)
Les poignées de référence sont la façon dont le reste du moteur recherche les objets de référence chargés (les détails techniques sont assez peu importants ici ; sachez simplement que chaque référence aura une poignée). Il y a un plafond de 1048576 poignées de référence actives à tout moment. Si vous atteignez ce plafond, le jeu restera bloqué au chargement, ou bien il fera un beau retour vers le bureau ou encore il fera un certain nombre de choses non désirées.
Le problème
1048576 est une limite assez élevée et quelque chose que vous ne devriez probablement pas atteindre pendant le jeu : il n'y a qu'un nombre limité de cellules réellement chargées, et la grande majorité des références sont temporaires et non persistantes.
Jusqu'à ce que vous regardiez le processus de chargement et que vous réalisiez que le chargement/déchargement de références temporaires est exclusif aux fichiers maîtres (ESM) et non aux plugins ordinaires (ESP). Toutes les références temporaires des plugins ordinaires sont chargées dans le jeu avant le menu principal. Cela inclut le cas où vous écrasez la référence temporaire d'un fichier maître dans un plugin.
Pour donner quelques chiffres qui mettent cela en perspective, Forgotten Dungeons SSE a 136356 références temporaires, Vigilant en a 110770. À eux seuls, ces deux plugins vous feront faire un quart du chemin vers le non-fonctionnement de votre jeu !
Je tiens à préciser que cela ne signifie pas que ce sont de mauvais mods. Le problème ici est que ces mods sont des fichiers ESP alors qu'ils devraient probablement être des fichiers maîtres ESM. On peut supposer que lorsque ce système a été conçu il y a plusieurs itérations du moteur avant Skyrim, l'idée était que tout ce qui ajoutait autant de références devait être un fichier maître.
Une autre chose à garder à l'esprit est qu'au cours du jeu, de nombreuses références uniques à votre jeu de sauvegarde sont créées, de sorte que vous pouvez arriver à un point où votre ordre de chargement + votre fichier de sauvegarde commencera à ne plus fonctionner même si votre ordre de chargement de base semble correct.
Vérification de votre ordre de chargement
Téléchargez le
script xEdit suivant et mettez-le dans votre dossier *edit/Edit Scripts. Chargez ensuite votre ordre de chargement complet dans xEdit et faites un clic droit -> Appliquer le script -> choisissez
count_loaded_refs_in_load_order et cliquez sur OK. Cela prendra quelques minutes pour s'exécuter, puis affichera dans le journal de toutes les références de votre ordre de chargement qui seront chargées avant que vous n'atteigniez le menu principal.
Le script n'est pas parfait mais il donne une approximation très proche (dans cet ordre de chargement de test que j'utilise, c'est ~2000 de moins que ce qui est réellement rapporté dans le jeu). Si votre total de références est proche de 1048576, et honnêtement même si c'est au-dessus de 900 000, vous êtes en territoire assez dangereux. Lorsque Ralgor a découvert que son propre ordre de chargement provoquait des plantages parce qu'il atteignait le plafond de références, il était à plus ou moins 1 million et essayait d'activer DynDOLOD, qui ajoute un grand nombre de références, ce qui provoquait l'arrêt de son jeu.
Solutions
Une solution serait un plugin qui augmente le plafond des référence handles. "CK fixes" fait cela dans le CK parce que c'est la seule façon de charger un grand plugin d'espace mondial, puisque le CK doit charger toutes les références temporaires comme persistantes de toute façon. Faire la même chose dans SSE lui-même est beaucoup plus difficile en raison des différences dans les options du compilateur.
Une autre solution potentielle est de traiter chaque plugin comme un fichier maître pour le chargement. Cette solution est étudiée par l'équipe de xEdit mais rien de concret n'a encore été décidé.
La solution "facile" si vous êtes à la limite ou très proche et que cela rend votre jeu instable est soit de supprimer les mods les plus lourds de votre ordre de chargement, soit de les transformer en fichiers maîtres via xEdit. Gardez à l'esprit que faire d'un plugin un fichier maître signifie qu'il sera dorénavant toujours chargé en premier dans votre ordre de chargement avec les autres fichiers maîtres, avant tous les autres plugins, c'est pourquoi cela pourrait ne pas être une solution facile en fonction du plugin en question.
Les références temporaires dans les ESPs ne se comportent pas de la même manière que les références temporaires dans les ESMs. Vous pouvez donc facilement atteindre le plafond de référence de 1048576 avec beaucoup de plugins qui ajoutent des références.
Si vous vous rapprochez dangereusement du plafond, supprimez les mods les plus lourds ou convertissez-les en fichiers maîtres. En réalité, il est préférable de ne pas s'en approcher, car plus vous jouez longtemps, plus il y a de références dans vos sauvegardes et plus vous risquez d'atteindre la limite.
J'ai pour ma part au 22 septembre 2021, le résultat suivant :
Found 586892 temporary and 129196 persistent loaded references, for a grand total of 716088 loaded references.