From ef5e4ba64f76262ceddca2cb5da86dfbde3b706c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Thu, 30 Mar 2023 15:13:21 +0200 Subject: [PATCH] Fixed ScriptClass leaking --- .../src/EditWindows/ComponentEditWindow.bf | 1 + GlitchyEngine/src/Scripting/ScriptClass.bf | 2 +- GlitchyEngine/src/Scripting/ScriptEngine.bf | 20 ++++++++--- GlitchyEngine/src/Scripting/ScriptInstance.bf | 3 +- .../src/World/Components/Components.bf | 2 -- GlitchyEngine/src/World/Scene.bf | 33 +++++++++++++++++-- ScriptCore/MyTestEntity.cs | 31 ++++++++--------- 7 files changed, 66 insertions(+), 26 deletions(-) diff --git a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf index ca7cc8d..630275b 100644 --- a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf +++ b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf @@ -453,6 +453,7 @@ namespace GlitchyEditor.EditWindows className == scriptComponent.Instance?.ScriptClass.FullName)) { scriptComponent.Instance = new ScriptInstance(script); + scriptComponent.Instance.ReleaseRef(); } } diff --git a/GlitchyEngine/src/Scripting/ScriptClass.bf b/GlitchyEngine/src/Scripting/ScriptClass.bf index 0ea2ee3..3b0f09e 100644 --- a/GlitchyEngine/src/Scripting/ScriptClass.bf +++ b/GlitchyEngine/src/Scripting/ScriptClass.bf @@ -4,7 +4,7 @@ using GlitchyEngine.Core; namespace GlitchyEngine.Scripting; -class ScriptClass +class ScriptClass : RefCounter { private String _namespace ~ delete _; private String _className ~ delete _; diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf index f9306d1..f83a331 100644 --- a/GlitchyEngine/src/Scripting/ScriptEngine.bf +++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf @@ -18,13 +18,13 @@ static class ScriptEngine private static Scene s_Context ~ _?.ReleaseRef(); - private static ScriptClass s_EntityRoot ~ delete _; - private static ScriptClass s_EngineObject ~ delete _; + private static ScriptClass s_EntityRoot ~ _?.ReleaseRef(); + private static ScriptClass s_EngineObject ~ _?.ReleaseRef(); private static Dictionary _entityScripts = new .() ~ { for (var entry in _) { - delete entry.value; + entry.value.ReleaseRef(); } delete _entityScripts; }; @@ -62,12 +62,22 @@ static class ScriptEngine SetReference!(s_Context, scene); } + public static void OnRuntimeStop() + { + for (var entry in _entityScriptInstances) + { + entry.value.ReleaseRef(); + } + _entityScriptInstances.Clear(); + + SetContext(null); + } + public static void InitializeInstance(Entity entity, ScriptComponent* script) { _entityScriptInstances[entity.UUID] = script.Instance..AddRef(); script.Instance.Instantiate(entity.UUID); - script.Instance.InvokeOnCreate(); } private static MonoAssembly* LoadCSharpAssembly(StringView assemblyPath) @@ -111,7 +121,7 @@ static class ScriptEngine { for (var entry in _entityScripts) { - delete entry.value; + entry.value.ReleaseRef(); } _entityScripts.Clear(); diff --git a/GlitchyEngine/src/Scripting/ScriptInstance.bf b/GlitchyEngine/src/Scripting/ScriptInstance.bf index 71c4a00..e7fd04e 100644 --- a/GlitchyEngine/src/Scripting/ScriptInstance.bf +++ b/GlitchyEngine/src/Scripting/ScriptInstance.bf @@ -17,7 +17,7 @@ class ScriptInstance : RefCounter public this(ScriptClass scriptClass) { Log.EngineLogger.AssertDebug(scriptClass != null); - _scriptClass = scriptClass; + _scriptClass = scriptClass..AddRef(); } private ~this() @@ -27,6 +27,7 @@ class ScriptInstance : RefCounter _scriptClass.OnDestroy(_instance); Mono.mono_gchandle_free(_gcHandle); } + _scriptClass?.ReleaseRef(); } public void Instantiate(UUID uuid) diff --git a/GlitchyEngine/src/World/Components/Components.bf b/GlitchyEngine/src/World/Components/Components.bf index 5962bc0..d8643bb 100644 --- a/GlitchyEngine/src/World/Components/Components.bf +++ b/GlitchyEngine/src/World/Components/Components.bf @@ -462,8 +462,6 @@ namespace GlitchyEngine.World public void Dispose() mut { ReleaseRefAndNullify!(_instance); - - } } } \ No newline at end of file diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index 9bac9a7..1e76ebb 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -76,8 +76,21 @@ namespace GlitchyEngine.World CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); - CopyComponents(this, target); + //CopyComponents(this, target); + for (let (sourceHandle, sourceComponent) in _ecsWorld.Enumerate()) + { + Entity sourceEntity = .(sourceHandle, this); + + Entity targetEntity = target.GetEntityByID(sourceEntity.UUID); + ScriptComponent* targetComponent = targetEntity.AddComponent(); + + // TODO: Do proper copy + + targetComponent.Instance = new ScriptInstance(sourceComponent.Instance.ScriptClass); + targetComponent.Instance..ReleaseRef(); + } + // Copy transforms for (let (sourceHandle, sourceTransform) in _ecsWorld.Enumerate()) { @@ -134,8 +147,8 @@ namespace GlitchyEngine.World public void OnRuntimeStop() { - ScriptEngine.SetContext(null); OnSimulationStop(); + ScriptEngine.OnRuntimeStop(); } public void OnSimulationStart() @@ -244,11 +257,27 @@ namespace GlitchyEngine.World if (!script.InInstantiated) { ScriptEngine.InitializeInstance(Entity(entity, this), script); + script.Instance.InvokeOnCreate(); } script.Instance.InvokeOnUpdate(gameTime.DeltaTime); } } + + /*if (mode.HasFlag(.Editor)) + { + // Run editor scripts + for (var (entity, script) in _ecsWorld.Enumerate()) + { + if (!script.InInstantiated) + { + ScriptEngine.InitializeInstance(Entity(entity, this), script); + } + + // TODO: Editor update + //script.Instance.InvokeOnUpdate(gameTime.DeltaTime); + } + }*/ if (mode.HasFlag(.Physics)) { diff --git a/ScriptCore/MyTestEntity.cs b/ScriptCore/MyTestEntity.cs index e657db2..59124cf 100644 --- a/ScriptCore/MyTestEntity.cs +++ b/ScriptCore/MyTestEntity.cs @@ -14,7 +14,8 @@ class MyTestEntity : Entity { Log.Info($"Create! {UUID}"); - _rigidBody = GetComponent(); + //_rigidBody = GetComponent(); + RemoveComponent(); } ///// @@ -31,24 +32,24 @@ class MyTestEntity : Entity /// void OnUpdate(float deltaTime) { - Vector2 force = Vector2.Zero; + //Vector2 force = Vector2.Zero; - if (Input.IsKeyPressed(Key.A)) - { - force.X -= 1000 * deltaTime; - } + //if (Input.IsKeyPressed(Key.A)) + //{ + // force.X -= 1000 * deltaTime; + //} - if (Input.IsKeyPressed(Key.D)) - { - force.X += 1000 * deltaTime; - } + //if (Input.IsKeyPressed(Key.D)) + //{ + // force.X += 1000 * deltaTime; + //} - if (Input.IsKeyPressing(Key.Space)) - { - force.Y += 2000; - } + //if (Input.IsKeyPressing(Key.Space)) + //{ + // force.Y += 2000; + //} - _rigidBody.ApplyForceToCenter(force); + //_rigidBody.ApplyForceToCenter(force); if (Input.IsMouseButtonReleasing(MouseButton.LeftButton)) {