Skyrim:Persistenz

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

Überblick

Persistenz ist die Handlung, die eine Objektreferenz im Spiel bleiben lässt und nicht deaktiviert werden lässt. Dies betrifft alle Referenzen im Spiel einschließlich Dinge wie Actor-Referenzen. Weil sie im Spiel bleiben, verbrauchen sie Prozessorzeit und Speicherplatz, während andere Referenzen im selben Gebiet verschwinden und deaktiviert werden.

Was macht Objekte persistent?

Die folgenden Dinge lässt ein Objekt im Spiel bleiben:

Funktionen

Wenn eine Funktion auf einem Objekt läuft, ein Objekt im Spiel solange die Funktion existiert. Das schließt auch lang laufende latente Funktionen ein.

Beispiele

<papyrusscript> Function MyFunction()

 ; Wir haben eine Funktion dieses Scripts betreten  - 
 ;Das Objekt, dass wir angehängt haben, ist nun persistent
 Util.Wait(300) ; Wir warten nun 5 Minuten – unser Objekt bleibt persistent!
 ; Nun wo wird die Funktion verlassen, bleiben wir nicht länger persistent 
 ;(sofern nicht etwas anderes uns am Leben erhält)

EndFunction </papyrusscript>

Properties

Wenn eine Script-Property auf eine Referenz im Editor zeigt, wird die Zielreferenz als "permanently persistent" markiert. Mit anderen Worten wird nichts was man zur Laufzeit tut, das Objekt deaktivieren. Dies bedeutet, dass man keine Properties nutzen sollte, um direkt auf eine Referenz zeigen zu lassen, sofern möglich. Wenn man kann, sollte man Referenzen aus Events oder anderen Orten einbeziehen, um zu vermeiden sie dauerhaft zu halten. Sogar wenn man einer Property einen neuen Wert zuweist, während das Spiel läuft, bleibt die Original-Referenz im Spiel erhalten.


Beispiele

<papyrusscript>

Diese Property ist auf etwas im Editor gesetzt –
es wird geladen, wenn das Spiel geladen wird und bleibt für immer erhalten!

ObjectReference Property OtherReference auto

Function MyFunction()

 ; Ich kann Dinge mit OtherReference machen in der  Gewissheit, 
 ;dass es im Spiel erhalten bleibt. 
 OtherReference.Activate(Game.GetPlayer())
 ; Jedoch wird das Originalobjekt sogar erhalten bleiben, 
 ; wenn ich die Property lösche oder neu zuweise 
 OtherReference = None   ; Das Original-Objekt stirbt nicht!

EndFunction </papyrusscript>

Variablen

Wenn eine beliebige Variable in einem derzeit geladenen Script auf eine Referenz zeigt, ist diese Referenz temporär persistent. Sie bleibt persistent bis keine Variablen mehr auf sie zeigen und wird dann gelöscht. (dies bedeutet, dass kein anderes Spielsystem das Objekt am Leben erhält). Dies bedeutet, dass man versuchen sollte, keine Variablen zu haben, die Objekte länger halten als sie benötigt werden. Man kann Variablen löschen, indem ihnen "None" zugewiesen wird.


Beispiele

<papyrusscript> ObjectReference myScriptVariable

Function MyFunction(ObjectReference myArg1, ObjectReference myArg2, ObjectReference myArg3)

 ; myArg1, myArg2, and myArg3 sind persistent solange die Funktion läuft
 myArg1.Activate(myArg2)
 ; wenn ich einem von ihnen ein anderes Objekt zuweise, 
 ;wird das Originalobjekt verschwinden. 
 myArg1 = None  ; Die Original-Reference kann sterben!
 ; wenn ich eins von ihnen einer Script-Variable zuweise, 
 ; wird das Objekt erhalten bleiben! 
 myScriptVariable = myArg2  ; wird nun erhalten bleiben, bis myScriptVariable gelöscht wird 
                            ; oder etwas neu zugewiesen bekommt 
 ; myArg3 hört auf, persistent zu sein, weil wir die Funktion verlassen 
 ; und es keiner anderen Variablen zugewiesen haben. 

EndFunction </papyrusscript>

Angemeldete Events

Jede Referenz, die als Empfänger verschiedener Events angemeldet wurde, ist persistent solange bis sie für die Events abgemeldet wird. Dies bezieht sich auf jedes Event, für das ausdrücklich angemeldet wurde, welches OnUpdate, OnLOS, OnSleep und OnAnimationEvent enthält (aber nicht darauf beschränkt ist)

Beispiele

<papyrusscript>

Das Objekt, das wir zuordnen wird nun persistent bis wir es abmelden

RegisterForUpdate(5.0) </papyrusscript>
<papyrusscript>

Das Objekt, das wir zuordnen wird nun nicht länger persistent
(unter der Voraussetzung, dass niemand sonst es am Leben erhält)

UnregisterForUpdate() </papyrusscript>

Fazit

Also sind ein paar Dinge zu beachten, wenn man es vermeiden will, Dinge zu lange im Spiel bleiben zu lassen:

  • Vermeide lange laufende Funktionen
  • Vermeide Properties auf Referenzen falls möglich
  • Variablen von Referenzen sollten nur so lange auf Referenzen zeigen so lange sie gebraucht werden.
  • Man sollte sich nur für Updates anmelden, solange man sie braucht.

Links