fehlerhafte Scripts

cornix

Abenteurer
Nachdem ich letzte Woche einen gebloateten Spielstand verabschieden musste, habe ich mich nach der Ursache dafür erkundigt. Ich konnte die Mod, die den Bloat verursacht hat nicht herausfinden, allerdings geben fast alle Quellen zu diesem Thema an, dass Savegamebloat durch fehlerhafte Scripts auftreten. Doch überall finden sich unterschiedliche Angaben darüber, ob Scripts nur gefährlich werden, wenn man sie deinstalliert oder schon bloaten, wenn sie aktiv sind. Das ist etwas verunsichernd. Weiß jemand von euch, wie gefährlich "user-made" Scriptmods wirklich für meinen Spielstand sind?
Ich würde mich über Antworten freuen.
cornix
 
Jedes Skript kann theoretisch für Savegame-Bloating verantwortlich sein, egal ob aktiv oder inaktiv. Savegame-Bloating bedeutet ja nur, dass sich die Größe des Spielstandes aufbläht. In der Regel entsteht dies tatsächlich beim Deinstallieren einer Mod, falls dann Skript-Reste weiterlaufen und fleißig Variablen in den Spielstand hineinspeichern.

Stell dir einfach vor, jemand verwendet in seiner Mod ein Skript, welches in jeder Sekunde 1000 neue Variablen in das Savegame reinspeichert. Dann hast du im Handumdrehen einen zu großen Spielstand, d.h. du kannst Savegame-Bloating sogar bei einer aktiven Mod haben. Aber natürlich schreibt kein Mod-Autor so ein sinnloses Skript.

Mit anderen Worten musst du im Grunde bei jeder Mod mit Skripten darauf vertrauen, dass der Autor wusste was er da tut. In der Regel reicht es aber auf die Kommentare zu den Mods zu vertrauen, denn Savegame-Bloating ist recht schnell bekannt und es wird dann entsprechend gewarnt. Oder aber du versuchst es auf eigene Faust und probierst die betreffende Mod einfach aus - dann musst du aber auch mit den Risiken leben ;)
 
  • Like
Reaktionen: cornix
Das SkSE Team arbeitet an einer Lösung:
SkSe v1.6.7:
- add console command ClearInvalidRegistrations to remove invalid OnUpdate() registrations
This prevents orphaned OnUpdate() events and the resulting bloated/broken saves when removing certain mods.
When applied to an already bloated save, it will stop growing further and instead shrink over time
as the game processes all queued events. This may take hours depending on the amount of bloat.
To execute automatically after each reload, add this to \Data\SKSE\skse.ini:
[General]
ClearInvalidRegistrations=1
 
@RoterHase: Das hilft aber nur, falls der Mod-Autor mit dem Befehl "OnUpdate()" gearbeitet hat. Theoretisch kann man Sabegame-Bloating aber auch durch schlecht programmierte Skripte verursachen (siehe das Beispiel mit den 1000 neuen Variablen pro Sekunde...), da kann man dann nichts mehr machen. ;)
 
Du kannst folgende Zeilen deiner Skyrim.ini hinzufügen:

[Papyrus]
bEnableLogging=1
bEnableTrace=1
bLoadDebugInformation=1

Dann findest du unter my games/skyrim verschiedene Logs. Das aktuelle kannst du mit einem Spoiler-Tag versehen hier reinstellen. Ich kenne mich damit zwar nicht sonderlich gut aus, aber andere vielleicht.

In meinem Log gibts u.a. bei verschiedenen Scripts des UOSP eine Meldung, die so lautet ... but the script no longer contains that property. Weiß jemand was das zu bedeuten hat? Das Savegame ist jedenfalls noch nicht übermäßig groß geworden.
 
  • Like
Reaktionen: Facke
@regenschein: Ist es möglich, dass du den UOSP irgendwann mal auf eine neuere Version geupdatet hast? Die Meldung deutet nämlich auf Überreste alter Skripte hin, siehe auch hier

Property X on script Y attached to <Form ID> cannot be initialized because the script no longer contains that property

This warning is displayed when a script is being initialized, and property X has an assigned value in the masterfile or plugin, but no longer exists in the compiled script Y attached to <Form ID>. This indicates that a script has been changed, but the value of the property was not cleared in the Property dialog. When a property has been assigned a value in the Creation Kit, deleting the property from a script and recompiling it does not immediately remove the property from the plugin. The plugin must be saved, then the Creation Kit should be closed and re-opened and the plugin reloaded. This problem can also be fixed by opening the script Property dialog and selecting "Clear Value" next to that property.

Quelle: Papyrus Runtime Errors
 
Beim UOSP kann das sein, aber bei den anderen Mods habe ich kein Update vorgenommen. Im Spoiler ein Auszug des Logs:

[04/30/2013 - 09:15:44PM] Reverting game...
[04/30/2013 - 09:15:44PM] warning: Property BFTMenu on script CarriageInitiate attached to CarriageInitiate (8401449A) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property MHP_DT on script MHP_ConfigScript attached to MHP_ConfigQuest (A502C4CD) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property MHP_Overwrite2 on script MHP_ConfigScript attached to MHP_ConfigQuest (A502C4CD) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property MHP_SetKeyType2 on script MHP_ConfigScript attached to MHP_ConfigQuest (A502C4CD) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property MHP_PH on script MHP_ConfigScript attached to MHP_ConfigQuest (A502C4CD) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property MHP_Basic on script MHP_ConfigScript attached to MHP_ConfigQuest (A502C4CD) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:44PM] warning: Property InventorUpgradeDefault on script KRY_TVPlayerAliasScript attached to alias PlayerAlias on quest KRY_TradingMCMStartupQuest (19001831) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:45PM] warning: Property Equipped on script mhp_setsscript attached to (FF0008B9) cannot be initialized because the script no longer contains that property
[04/30/2013 - 09:15:48PM] Loading game...

BFT ist Better Ships and Carriages, kein Update vorgenommen
MHP ist More Hotkeys Please, kein Update vorgenommen
KRY_TVPlayerAliasScript gehört zu Trade&Barter, kein Update vorgenommen

Mit diesen Mods habe ich ein neues Spiel begonnen und sie seitdem nicht aktualisiert, deshalb kann das wahrscheinlich nicht die Ursache für die Fehler sein. Ist es möglich, dass die Autoren dieser Mods ihrerseits bei einem Versions-Update unsauber gearbeitet haben? Alle Meldungen, die wegen eines UOSP-Update vorkommen, hab ich mal ausgelassen. Das konnte ich rausfinden.

Ansonsten weist das Log keine Auffälligkeiten auf.
 
Der save wurde inzwischen gelöscht.
Ich habe das mit der SKSE.ini getestet, das hat auch ganz gut funktioniert. Das Problem: Bei meinem neuen save scheint (obwohl ich nur Mods verwende, die mit Sicherheit nicht bloaten) die Größe deutlich schneller zuzunehmen als gewohnt. Normalerweise hatte ich einen Zuwachs von ca. 1 Mb/14h, doch mit dieser Einstellung aktiv, wuchs mein save in einer halben Stunde um 250 kb. Ich habe den ini-Eintrag gelöscht, doch keine Veränderung. Wenn ich meinen Char nicht großartig bewege, wird der save kleiner, wenn ich normal spiele wächst er viel zu schnell.

@regenschein: Diese Meldungen vom UOSP sind ziemlich häufig in meinem Log aufgetaucht....(Bei meinem alten save, im neuen nur vereinzelt)
 
Meine Saves sind nach einigen dutzend Stunden nicht viel größer als 10 MB und sie wachsen auch nicht besonders. Ich weiß aber nicht, wie groß so ein normales Savegame sein soll.
 
Das Seltsame ist ja, dass dieses Script aus SKSE offenbar immer noch aktiv ist, obwohl ich es deaktiviert habe und munter etwas in den save speichert. Der Wachstumsanstieg hat mit dem Moment begonnen, in dem ich die Werte in der ini auf 1 gesetzt habe...und nach der Zurücksetzung auf 0 nicht aufgehört
 
Bei einer Größe des Speicherstandes von ~15 MB nach einiger Spielzeit ist vollkommen in Ordnung, auch noch 20 MB bei einem weit fortgeschrittenen Spielstand. Kritisch wirds in der Regel erst darüber hinaus, oder insbesondere dann, wenn die Größe deutlich wächst. Ein Wachstum um 250 kB sagt nichts aus, das hängt ganz davon ab, wieviele Skriptintensive Mods laufen, wie viele Quests in dieser Zeit gestartet wurden, usw... Es geht beim Savegame-Bloating eher um ein prinzipielles und rasantes Wachstum der Größe. Die Faustregel ist, dass wenn man Savegame-Bloating hat, dann erkennt man es auch sofort an den Größen seinen Speicherstände ;)

@cornix: Welche Werte hast du konkret auf 1 (und dann wieder auf 0) gesetzt? Das Skripte auch nach Deaktivierung einer Mod noch Weiterlaufen ist nichts ungewöhnliches. Aus diesem Grund sollte man theoretisch auch keine Mods im Spielverlauf wieder deaktivieren, sondern vor dem Spielbeginn sich für eine Mod-Konstellation entscheiden und diese dann beibehalten.
 
Ich habe hier ja auch keinen bloat mehr, ich vergleiche nur: Wachstum vor und nach der Aktivierung des ClearInvalidRegistrations Tools. Ich habe den Wert ClearInvalidRegistrations = 1 zur Deaktivierung wieder auf 0 gesetzt. (in der SKSE-ini) Der angesprochene script ist eher ein Konsolenbefehl, den SKSE in endlosschleife ausführt, kein Mod.
 
Zuletzt bearbeitet:
Hab den Wert auch auf 1 gestellt und kann kein Anwachsen der Saves deswegen feststellen. Sind mittlerweile sogar unter 10 MB.

@Wetterfrosch: Hast du eine Ahnung, warum die oben genannten Mods Fehler produzieren, obwohl ich sie weder deinstalliert noch aktualisiert habe? Und hat das überhaupt einen Einfluss aufs Spiel?
 
Hab den Wert auch auf 1 gestellt und kann kein Anwachsen der Saves deswegen feststellen. Sind mittlerweile sogar unter 10 MB.
Ich werde es mal reaktivieren und noch ein paar Spielstunden mehr drinlassen...vielleicht ist der stärkere Zuwachs ja nur eine Phase des Tools, so nach dem Motto "Es muss schlimmer werden bevor es besser wird"...:?
 
Zuletzt bearbeitet:
@cornix: Dieser Befehl dürfte für sich genommen eigentlich gar kein Anwachsen der Savegame-Größe nach sich ziehen, wenn dann höchstens ein allmähliches Schrumpfen der Größe... allerdings hängt das Wachstum wie gesagt viel stärker davon ab (zumindest falls kein Savegame-Bloating vorliegt), wieviele Mods gerade aktiv sind, was du in der Zeit im Spiel machst, welche Quests du wie triggerst usw... Deine Beobachtung zum Savegame-Wachstum dürfte daher mit Sicherheit nicht mit diesem Befehl zusammenhängen.


@regenschein: Ich hätte zwei Vermutungen (!), wie es zu diesen Log-Einträgen kommen könnte:

1) Der Mod-Autor hat unsauber gearbeitet und seine Mod enthält Properties, die gesetzt werden sollten, was aber aufgrund abgeänderter Skripte nicht mehr passiert. Ich kenne mich viel zuwenig im TES-Modding aus, als dass ich das näher beurteilen könnte...

2) Für viel wahrscheinlicher halte ich das folgende Phänomen, welches Xgf hier in Beitrag #181 beschrieben hat:

Die LoadOrder der Mod hat Einfluss auf die effektive UID der Objeckte in deinem Save. Jedes Objekt hat eine UID z.B. 07801C. Beim Laden der Mod kommen dann 2 Stellen (LoadOrder) hinzu. Aus 07801C wird 3207801C. Es ist gut möglich, dass es 2 Objecte aus 2 verschiedenen Mod mit der ID 07801C gibt. Dann wird daraus z.B. 3207801C und z.B. 1407801C.
Ich frage mich schon lange, was alles schief gehen könnte, beim verändern der Mod Lade Liste?

Die Folge davon könnten durchaus nicht gesetzte Properties sein, so wie du sie im Log beobachtest... Und ich gehe mal davon aus, dass du schonmal eine Ladereihenfolge geändert hast, nicht wahr? ;)
 
  • Like
Reaktionen: cornix
@cornix: Dieser Befehl dürfte für sich genommen eigentlich gar kein Anwachsen der Savegame-Größe nach sich ziehen, wenn dann höchstens ein allmähliches Schrumpfen der Größe... allerdings hängt das Wachstum wie gesagt viel stärker davon ab (zumindest falls kein Savegame-Bloating vorliegt), wieviele Mods gerade aktiv sind, was du in der Zeit im Spiel machst, welche Quests du wie triggerst usw... Deine Beobachtung zum Savegame-Wachstum dürfte daher mit Sicherheit nicht mit diesem Befehl zusammenhängen.
Dann liegt es wahrscheinlich an getriggerten quests...in dem Zeitraum habe ich einiges an der MQ gemacht...Danke!:)
 
Stell dir einfach vor, jemand verwendet in seiner Mod ein Skript, welches in jeder Sekunde 1000 neue Variablen in das Savegame reinspeichert. Dann hast du im Handumdrehen einen zu großen Spielstand, d.h. du kannst Savegame-Bloating sogar bei einer aktiven Mod haben. Aber natürlich schreibt kein Mod-Autor so ein sinnloses Skript.
Ein Script kann keine neuen variablen generieren. Variablen werden gesetzt und deklariert. Der Script ändert dann deren Inhalt.

Wenn man z.B. mit RegisterForUpdate arbeitet und die Ausführung der UpdateProzedur länger dauert als der UpdateIntervall den man gesetzt hat, dann bläht sich der save auf. Dieser Script verhindert dann auch zunehmend, dass andere laufen und der save ist am A.

Der Save wächst je, mehr Gebiet man erkundet hat. Denn für jede Zelle die man betritt, müssen von nun an die beweglichen, veränderlichen Dinge im Save gespeichert werden. Je mehr Quest aktive sind und je mehr mod man drauf hat.
 
Zuletzt bearbeitet:
@Xgf: Danke für deine Erklärungen. Wie gesage kenne ich Papyrus eigentlich kaum, sodass ich nicht wusste, dass sich dort Variablen nicht dynamisch generieren lassen. In anderen Programmiersprachen ist das ja bekanntlich machbar. Nichtsdestoweniger ändert sich dadurch an der Schlussfolgerung in meinem Zitat ja nichts, auch wenn das Beispiel natürlich falsch war ;)