Fixed ScriptClass leaking

This commit is contained in:
Simon Lübeß
2023-03-30 15:13:21 +02:00
parent 4fd9a924a0
commit ef5e4ba64f
7 changed files with 66 additions and 26 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ using GlitchyEngine.Core;
namespace GlitchyEngine.Scripting;
class ScriptClass
class ScriptClass : RefCounter
{
private String _namespace ~ delete _;
private String _className ~ delete _;
+15 -5
View File
@@ -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<StringView, ScriptClass> _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();
@@ -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)
@@ -462,8 +462,6 @@ namespace GlitchyEngine.World
public void Dispose() mut
{
ReleaseRefAndNullify!(_instance);
}
}
}
+31 -2
View File
@@ -76,8 +76,21 @@ namespace GlitchyEngine.World
CopyComponents<Rigidbody2DComponent>(this, target);
CopyComponents<BoxCollider2DComponent>(this, target);
CopyComponents<CircleCollider2DComponent>(this, target);
CopyComponents<ScriptComponent>(this, target);
//CopyComponents<ScriptComponent>(this, target);
for (let (sourceHandle, sourceComponent) in _ecsWorld.Enumerate<ScriptComponent>())
{
Entity sourceEntity = .(sourceHandle, this);
Entity targetEntity = target.GetEntityByID(sourceEntity.UUID);
ScriptComponent* targetComponent = targetEntity.AddComponent<ScriptComponent>();
// TODO: Do proper copy
targetComponent.Instance = new ScriptInstance(sourceComponent.Instance.ScriptClass);
targetComponent.Instance..ReleaseRef();
}
// Copy transforms
for (let (sourceHandle, sourceTransform) in _ecsWorld.Enumerate<TransformComponent>())
{
@@ -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<ScriptComponent>())
{
if (!script.InInstantiated)
{
ScriptEngine.InitializeInstance(Entity(entity, this), script);
}
// TODO: Editor update
//script.Instance.InvokeOnUpdate(gameTime.DeltaTime);
}
}*/
if (mode.HasFlag(.Physics))
{