Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24
  1. #1
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard Script-Performance erhöhen

    Hallo, Leute,
    mein Mod hat eine Funktion, die zwei blutrote Imagespace Modifier überlagert, der erste bei 30%, dann nochmals bei 15% Gesundheit. Die Funktion habe ich in ähnlicher Form in beiden Fallouts, als Teil eines Quest-Scripts mit Default-Delay und einer Prio von 5.
    Die Funktion selbst geht, aber die Performance ist nicht gerade gut, in NV noch übler als in FO3. Passiert schnell mal, dass die Filter erst im Tod angehen oder deaktiviert werden, wenn meine Gesundheit längst wieder oben ist. Ist auch plausibel, da die Geusndheit vor allem runtergeht, wenn sowieso viel im Spiel passiert.
    Könnte natürlich auch sein, dass das Einblenden von Imagespace Modifiern prinzipbedingt langsam ist.

    Gibt es da Möglichkeiten, das noch schneller zu machen? Ich erwarte nicht unbedingt eine 100%ige Reaktion, wie man es von Shootern kennt, wo man anhand der Screen-Farbe mehr oder weniger exakt die aktuelle Gesundheit bestimmen kann, aber doch, dass die Funktionen in weniger als 2 Sekunden ausgeführt werden.

    Gibt es dafür nur die Lösung von Quest und den Modifieren oder übersehe ich da was besseres?

    Grüsse
    Boïndil
    No mods for Failout 76.

  2. #2
    Meisterin der Klinge Avatar von Aaaaaimbot
    Registriert seit
    17.05.2009
    Ort
    Grayditch (Brandices Haus)
    Beiträge
    5.233

    Standard

    "Script Processing Delay" auf einen ganz niedrigen Wert stellen.
    Schluß mit Verschlimmbesserungen - laßt die guten alten Zeiten wieder aufleben! Jede "Neuerung" ist ein Rückschritt gegenüber Oblivion! (Zur Verdeutlichung: Oblivion = The Elder Scrolls 4.)
    Meine Fallout-3-Mods, mein Youtube-Kanal, I Wanna Be The Jill, mein Mod zu "Jill of the Jungle" von Epic MegaGames, mein Buch (eine abgefahrene Story) bei Amazon, mein NetHack-Mod "Slash'EM Extended" (Freeware)
    Wir sind die Räuber und es wird Zeit, daß ihr das Fürchten lernt! (Amy's Fanfiktion-Profil)

  3. #3
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Das ist mir schon klar.
    So wie es aussieht, kommen Quest-Funktionen in einen Queue(hinten rein, vorne raus) und wenn viel los ist, verzögert sich das.
    Theoretisch könnte man ja auch in einem mitgeführten Item oder zu tragenden Kleidungsstück ein permanentes Gamemode-Script haben, ich weiss aber nicht, wie elegant das ist.
    No mods for Failout 76.

  4. #4
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Ich versuche immer noch, die Performance-Fresser möglichst zu minimieren.
    -möglichst viele Funktionen in Quests mit möglichst hohem Intervall platzieren(z.B. haben meine Karawanen einen 60-Sekunden-Intervall)
    -möglichst viele Funktionen in Blöcken wie OnDeath, OnCombatEnd, usw. platzieren, die nur einmalig ausgeführt werden
    -performancefressende Operationen und Abfragen innerhalb möglichst einfachen Abfragen platzieren

    Viele meiner Scripte für Actors sehen etwa so aus:
    Code:
    If SpawnState == 0
    	; Einmalige Start-Funktionen
    	Set SpawnState To 1
    EndIf
    
    If SpawnState == 1
    	If .... ; Komplexe Abfrage
    		; Ueberwachungsfunktionen
    		Set SpawnState To 2
    	EndIf
    EndIf
    
    If SpawnState == 2
    	If .... ; Komplexe Abfrage
    		If .... ; Sehr komplexe Abfrage
    			; Ueberwachungsfunktionen
    			Set SpawnState To 3
    		EndIf
    	EndIf
    EndIf
    Bringt das noch was, wenn ich den ganzen Block in einen Timer nehme, der das alles alle 5 Sekunden abarbeitet?
    Actor-Scripte werden sonst ein Mal pro Frame abgearbeitet und wenn ich 70 Actors in der Szene habe, sind das mindestens 70 * 3 Abfragen pro Frame
    No mods for Failout 76.

  5. #5

    Standard

    Kann mir das schlecht vorstellen, kannst du nicht den ganzen Script reinschreiben mit Abfragen? Und hier handelt es sich jetzt um einen Quest-Script oder?
    Geändert von Galerion (12.09.2012 um 17:06 Uhr)

  6. #6
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Ich arbeite in allen Scripten mit solchen Variablen wie SpawnState. Bei den Quests kann man allerdings im Timeout definieren, wie lange es zwischen einem und dem nächsten Durchgang dauert.
    Alle anderen Scripte werden rasend schnell abgearbeitet und da frage ich mich ob ich das obige alles in einen Intervall-Block nehmen soll. Die Vanilla-Scripte haben das auch nicht, aber das hat nichts zu sagen, da Bethesda kein Weltmeister in der Optimierung von Scripten ist.

    Das hier meine ich mit Intervall-Block:

    Code:
    If SpawnInterval < 0
        ; Alle Funktionen hier rein
        Set SpawnInterval To 5
    Else
        Set SpawnInterval To SpawnInterval - GetSecondsPassed
    EndIf
    Es ist kaum für sich performanceintensiv, einen Zähler runter zu zählen, bis er unter 0 ist, aber wenn ich z.B. ein Mal pro Frame abfrage, wie weit der Player weg ist, ob er schwimmt oder läuft und welche Tageszeit gerade ist, dann könnte das Performance fressen.

    Im Anhang ist ein Beispiel-Script, das von den Karawanen-Anführern verwendet wird.
    Angehängte Dateien Angehängte Dateien
    Geändert von Boïndil (12.09.2012 um 15:42 Uhr)
    No mods for Failout 76.

  7. #7

    Standard

    Ich muss sagen das System ist ja schon ganz ausgeklügelt. Ja, du hast recht, es ist sicher besser den Zähler zu lassen, als wie wenn du die Spieler Posistion durch GetDistance abfragst.

    Aber vielleicht helfen dir diese Tipps etwas weiter:

    1.
    Wird der Script auch in den Interiors abgespielt? Du könntest das ganze durch eine Abfrage erweitern. Also den Interval-Script.

    2.
    Eventuell doch überlegen auf GetCurrentTime Zähler umzusteigen, denn ein Spieler kann ja eigentlich nicht kürzer als wie 1 Stunde warten. Das heißt du könntest zum Beispiel alle 3 Ingame-Minuten die Scripte abspielen lassen. Die Abfrage wird sicher etwas komplizierter aber vielleicht benötigt sie nicht soviel Performance.

    3.
    Ich hab gesehen, dass die Scripte durch "SpawnState" abgefragt werden, ist das eine Package-Variable oder? Ansonsten könnte ich dir nochmal diese Abfrage empfehlen: ActorID.GetCurrentAIPackage
    Auch wenn das ganze dann sicher ziemlich kompliziert wird, aber du könntest ja Abfragen ob der NPC gerade wandert durch ein Wander/Travel-Package zum Beispiel oder ob er gerade mit ein Guard-Package wartet und auf die Script instruktionenwartet. Natürtlich nur von der Theorie her, wird wahrscheinlich sehr schwer umzusetzen zu sein. Wenn du sagst das du 70 Scripte hast.
    Geändert von Galerion (12.09.2012 um 17:53 Uhr)

  8. #8
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Jede Abfrage,die gemacht werden muss, wird in allen Scripten, ausser Quest-Scripten ein Mal pro Frame ausgeführt, das kann man gar nicht verhindern. Und ich denke, dass es billiger kommt, eine interne Variable(wie SpawnState) auszuwerten, als eine Eigenschaft eines NPC(wie ein Package oder ob er sich in einem Interior befindet). Das mit dem GetCurrentTime bringt kaum Vorteile, da diese Abfrage ja auch jedes Mal gemacht werden muss. Und viele Scripte sollen schnell reagieren, nur reicht es meistens, wenn es innerhalb 5 Sekunden ist.
    Code:
    If SpawnState == 1
       If Player.IsIninterior
         ; Mach was
       EndIf
    EndIf
    Die Abrage, ob sich der Player in einem Interior befindet, wird nur dann ausgewertet, wenn SpawnState 1. Wenn ich jetzt aussen rum nochmals einen Zähler mache, werden alle Abfragen innerhalb für fünf Sekunden ignoriert und es können sehr viele Abfragen sein. Ich schätze mal, dass pro Frame schnell mehr als hundert Scripte ausgeführt werden und das nicht nur von mir. Ich frage mich nur, wieviel man damit spart, wenn 20 Scripte von über 100 besser optimiert sind und sowieso schon aus möglichst wenigen Abfragen bestehen.
    Geändert von Boïndil (13.09.2012 um 07:02 Uhr)
    No mods for Failout 76.

  9. #9

    Standard

    Ja, aber wenn der Script so lauten würde:

    Code:
    Begin Gamemode
     ....
    If (SpawnState == 1) && (Player.IsIninterior == 1)
        ; Mach was
    EndIf
     ....
    End
    Dann kostet der keine Performance, oder sicher nur minimale Performance. Weil er nur einmal abgefragt wird und der restliche Script wird dann sofort angehalten.

    Zum Timer:
    Naja, es wird halt schwer feststellen zu sein ob der Timer überhaupt sehr viel Performance wegnimmt, da müsstest du alle Scripte die dran hängen mal deaktivieren und das mit einem FPS-Anzeige-Programm testen. Aber generel glaub ich, wenn immer so ein Timer läuft, dass die Absturz-Rate in ganzem schon steigt und die Performance abnimmt, auch wenn es nur ein so kleiner Script ist.

    Außerdem glaube ich nicht das dir eine "GetInWorldspace" Abfrage zum Beispiel jetzt, die Performance wegnimmt sondern Scripte, welche sich immer in den 5 Sekunden wiederholen, aber erst zum Beispiel wieder anspringen müssen wenn du die Megaton-World verlassen hast.

    Natürlich habe ich aber nie soviele Scripte eingebaut die alle 5 Sekunden laufen und deshalb wirst du das sicher besser beurteilen können. Aber wenn du mal zum Beispiel EF gespielt hast und die Lichter in Lawton bemerkst, diese waren / sind noch zum Teil Timer gesteuert und solche Scripte ziehen ziemlich das Spiel runter. Weil sie einfach immer laufen.

    Ein Script soll nur dann laufen wenn er auch wirklich gebraucht wird, meiner Meinung nach.

    Wenn du die Scripte nicht durch mehr Abfragen einschränkst so das er nicht immer läuft, dann wirst du das wohl nicht mehr verbessern können oder musst vielleicht einen anderen Weg gehen. Auch hier wäre zum Beispiel wieder der Debug-Modus von Oblivion hilfreich. ):
    Geändert von Galerion (13.09.2012 um 15:33 Uhr)

  10. #10
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    Scripte(oder Abfragen) müssen nicht abspringen, man kann nur die Anzahl der Abfragen minimieren, die sich zuoberst befinden und ein mal pro Frame ausgeführt werden, indem man sie in einen Zähler platziert. Scripte können auch nicht stoppen, die werden unendlich lange durchlaufen. Und eine Abfrage zuoberst in GameMode, ob du dich in einem Interior befindet, wird auf jeden Fall alle Frames abgefragt, egal wo du dich befindest.
    Der Timer ist ja genau eine sehr einfache Abfrage, die alle anderen in sich abkapselt und sperrt. Wenn das TimeOut 0 oder grösser ist, werden alle anderen Abfragen innerhalb nicht ausgeführt und das z.B. 5 Sekunden lang.
    If TimeOut < 0
    If GetInWorldSpace XXX
    If IsSwimminmg
    If GetGameHour > X
    If GetInFaction X
    If...
    If...
    If...
    EndIf
    Ich verwende Timer ja sehr häufig. Wenn das die Absturz-Gefahr vergrössern würde, müsste man ganz aufhören zu scripten.
    Ich habe keinen Zweifel, dass ein Timer weniger Performance frisst, als eine Abfrage ActorRef.GetInWordSpace Megaton. Denn dann muss das Script den Zustand eines NPC in einer Zelle abrufen, die beide vielleicht gar nicht im Speicher liegen. Ich frage mich nur, ob der Timer den Aufwand wert ist, da ich mit SpawnState sowieso schon verhindere, dass eine Abfrage ausgeführt wird, die zu einem gegebenen Zeitpunkt unnötig ist.
    No mods for Failout 76.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •