Hallo zusammen,
in letzter Zeit habe ich zunehmend Memory Leaks in meinem Spiel festgestellt, und schließlich HUD Maker Ultra als Ursache identifiziert.
Ich habe mich jetzt einige Tage mit dem Code beschäftigt und alles mögliche versucht. Aber meine Fähigkeiten reichen leider nicht, um einen funktionierenden Fix hinzubekommen.
Falls jemand mit besseren JavaScript-Kenntnissen helfen möchte, dieses Plugin zu "retten", wäre ich wirklich dankbar.
Leider hat der Autor den Support eingestellt und reagiert seit Jahren nicht mehr auf Anfragen. Ich weiß, es ist super undankbar, die Arbeit anderer Leute zu fixen, aber dieses Plugin ist enorm mächtig.
Und - das zumindest muss man sagen - es ist sehr übersichtlich strukturiert und man findet sich thematisch gut zurecht.
Kurz gesagt ist es ein Plugin, das mit einem externen Editor kommt. Darin kann man HUDs gestalten, mit so ziemlich allem, was man sich nur vorstellen kann. Füllbalken, Bilder, Formen, Custom Code und individuellen Bedingungen für jedes Element. Das alles wird in eine Json-Datei exportiert, die wiederum vom Plugin interpretiert wird. Bis dahin wirklich beeindruckend.
Problematisch ist allerdings, wie das HUD gehandhabt wird. Bei jedem Szenenwechsel (z.B. Mapwechsel), wird das komplette HUD neu in den Cache geladen. Alle Elemente, Sprites, Bitmaps, etc. liegen unsichtbar im Hintergrund und warten darauf, dass ihre Conditions erfüllt werden. Das Problem dabei ist, dass die alten Instanzen des HUDs nicht entfernt werden. Wenn ich über 50 Teleporter laufe, habe ich also 50x das komplette Asset-Paket im Speicher. Binnen weniger Minuten kann ich den RAM überlaufen lassen, wenn ich es darauf anlege. Ohne das Plugin ist der RAM stabil niedrig.
Im Code sind diverse destroy()-Befehle platziert, die aber entweder nur den Code zum Initialisieren der HUD-Instanzen entfernt, oder aber dem Autor war nicht bewusst, dass andere Komponenten des Plugins die Sprites am Leben halten, da sie noch darauf referenzieren.
Das Plugin besteht aus zwei Files: SRD_HUDMakerUltra.js und SRD_UltraBase.js
Im SRD_HUDMakerUltra.js werden die HUD-Elemente erzeugt.
Im SRD_UltraBase.js befinden sich Listener, die in jedem Frame kommunizieren, ob die Bedingungen erfüllt sind, und ob die HUD-Elemente sichtbar werden müssen.
Diese Listener sind bei meinen Versuchen immer das Problem.
Mal verhindern sie, dass die Elemente aus dem Cache geleert werden, weil sie noch damit kommunizieren, und mal crasht das Spiel, weil die HUD-Elemente nicht mehr da sind, um zu kommunizieren.
Ich weiß nicht, was die beste Lösung wäre.
Mein letzter Versuch (ebenfalls nicht erfolgreich) war, den Szenenwechsel zu modifizieren. Sodass er im Grunde so abläuft:
1. Stoppe alle Listener, kappe alle Verbindungen zu den HUD-Elementen
2. Zerstöre alle HUD-Elemente, gib den Speicher frei
3. Führe den Teleport durch (oder was auch immer für die neue HUD-Instanz verantwortlich ist)
4. Generiere ein neues HUD im Hintergrund
5. Reaktiviere die Listener
Falls jemand einen Blick riskieren will, SRD_HUDMakerUltra.js und SRD_UltraBase.js sind hier zu finden:
Vielen Dank im Voraus für jede Form von Unterstützung.