From 7b75720999eb6100471bc7ea733155356af900a2 Mon Sep 17 00:00:00 2001 From: Karpik Date: Mon, 2 Mar 2026 20:11:19 +0400 Subject: [PATCH 1/2] Add static method to clear static fields --- src/DebugUtils/TypeMeta.cs | 8 ++++++++ src/EcsAspect.cs | 5 +++++ src/EcsStaticCleaner.cs | 18 ++++++++++++++++++ src/EcsWorld.static.cs | 5 +++++ src/Injections/Injector.cs | 6 ++++++ src/Internal/EcsTypeCodeManager.cs | 5 +++++ src/Utils/IConfigContainer.cs | 5 +++++ 7 files changed, 52 insertions(+) create mode 100644 src/EcsStaticCleaner.cs diff --git a/src/DebugUtils/TypeMeta.cs b/src/DebugUtils/TypeMeta.cs index 7c3d8c9..1f8ad7b 100644 --- a/src/DebugUtils/TypeMeta.cs +++ b/src/DebugUtils/TypeMeta.cs @@ -623,5 +623,13 @@ namespace DCFApixels.DragonECS #endregion } #endregion + + internal static void Clear() + { + lock (_lock) + { + _metaCache.Clear(); + } + } } } \ No newline at end of file diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index 75a3be2..15aeb18 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -467,6 +467,11 @@ namespace DCFApixels.DragonECS public delegate void OnBuildApectHandler(object aspect, EcsMask mask); public static event OnBuildApectHandler OnAfterInit = delegate { }; #endregion + + internal static void Clear() + { + _staticMaskCache.Clear(); + } } #region EcsAspect.Builder.Extensions diff --git a/src/EcsStaticCleaner.cs b/src/EcsStaticCleaner.cs new file mode 100644 index 0000000..6007943 --- /dev/null +++ b/src/EcsStaticCleaner.cs @@ -0,0 +1,18 @@ +using DCFApixels.DragonECS.Core.Internal; + +namespace DCFApixels.DragonECS +{ + public static class EcsStaticCleaner + { + public static void ResetAll() + { + TypeMeta.Clear(); + Injector.InjectionList.Clear(); + // MemoryAllocator.Clear(); + EcsTypeCodeManager.Clear(); + ConfigContainer.Clear(); + EcsAspect.Clear(); + EcsWorld.Clear(); + } + } +} \ No newline at end of file diff --git a/src/EcsWorld.static.cs b/src/EcsWorld.static.cs index 033321a..c9b94cf 100644 --- a/src/EcsWorld.static.cs +++ b/src/EcsWorld.static.cs @@ -346,5 +346,10 @@ namespace DCFApixels.DragonECS return FindPoolInstance(componentType); } #endregion + + internal static void Clear() + { + _allWorldComponentPools.Clear(); + } } } \ No newline at end of file diff --git a/src/Injections/Injector.cs b/src/Injections/Injector.cs index df558b0..c68c965 100644 --- a/src/Injections/Injector.cs +++ b/src/Injections/Injector.cs @@ -357,6 +357,12 @@ namespace DCFApixels.DragonECS instance.Inject(_injectedData); } } + + internal static void Clear() + { + _Empty_Internal._injections.Clear(); + _Empty_Internal._nodes.Clear(); + } } #endregion } diff --git a/src/Internal/EcsTypeCodeManager.cs b/src/Internal/EcsTypeCodeManager.cs index ea902a1..b2c2041 100644 --- a/src/Internal/EcsTypeCodeManager.cs +++ b/src/Internal/EcsTypeCodeManager.cs @@ -53,6 +53,11 @@ namespace DCFApixels.DragonECS.Core.Internal return null; } public static IEnumerable GetDeclaredTypes() { return _codes.Select(o => new TypeCodeInfo(o.Key, o.Value)); } + + internal static void Clear() + { + _codes.Clear(); + } } #if ENABLE_IL2CPP [Il2CppSetOption(Option.NullChecks, false)] diff --git a/src/Utils/IConfigContainer.cs b/src/Utils/IConfigContainer.cs index 98192f0..b5a6103 100644 --- a/src/Utils/IConfigContainer.cs +++ b/src/Utils/IConfigContainer.cs @@ -102,6 +102,11 @@ namespace DCFApixels.DragonECS { return GetAllConfigs().GetEnumerator(); } + + internal static void Clear() + { + Empty._storage.Clear(); + } } public static class ConfigContainerExtensions { From b6ae601cff3dffbc287d242beb42bc62e606a8ae Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:00:52 +0800 Subject: [PATCH 2/2] fix/improve static cleanup --- src/DebugUtils/TypeMeta.cs | 16 ++++++++-------- src/EcsAspect.cs | 9 ++++----- src/EcsStaticCleaner.cs | 18 ------------------ src/EcsWorld.cs | 4 ---- src/EcsWorld.static.cs | 10 +--------- src/Internal/EcsTypeCodeManager.cs | 5 ----- src/Utils/IConfigContainer.cs | 5 ----- 7 files changed, 13 insertions(+), 54 deletions(-) delete mode 100644 src/EcsStaticCleaner.cs diff --git a/src/DebugUtils/TypeMeta.cs b/src/DebugUtils/TypeMeta.cs index 1f8ad7b..0422993 100644 --- a/src/DebugUtils/TypeMeta.cs +++ b/src/DebugUtils/TypeMeta.cs @@ -370,6 +370,14 @@ namespace DCFApixels.DragonECS #endregion #region Other + public static void ClearCache() + { + lock (_lock) + { + _metaCache.Clear(); + _metaCache.Add(typeof(void), NullTypeMeta); + } + } ITypeMeta ITypeMeta.BaseMeta { get { return null; } @@ -623,13 +631,5 @@ namespace DCFApixels.DragonECS #endregion } #endregion - - internal static void Clear() - { - lock (_lock) - { - _metaCache.Clear(); - } - } } } \ No newline at end of file diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index 15aeb18..0a2afc9 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -411,6 +411,10 @@ namespace DCFApixels.DragonECS #endregion #region Other + public static void ClearCache() + { + _staticMaskCache.Clear(); + } EcsMask IComponentMask.ToMask(EcsWorld world) { return _mask; } #endregion @@ -467,11 +471,6 @@ namespace DCFApixels.DragonECS public delegate void OnBuildApectHandler(object aspect, EcsMask mask); public static event OnBuildApectHandler OnAfterInit = delegate { }; #endregion - - internal static void Clear() - { - _staticMaskCache.Clear(); - } } #region EcsAspect.Builder.Extensions diff --git a/src/EcsStaticCleaner.cs b/src/EcsStaticCleaner.cs deleted file mode 100644 index 6007943..0000000 --- a/src/EcsStaticCleaner.cs +++ /dev/null @@ -1,18 +0,0 @@ -using DCFApixels.DragonECS.Core.Internal; - -namespace DCFApixels.DragonECS -{ - public static class EcsStaticCleaner - { - public static void ResetAll() - { - TypeMeta.Clear(); - Injector.InjectionList.Clear(); - // MemoryAllocator.Clear(); - EcsTypeCodeManager.Clear(); - ConfigContainer.Clear(); - EcsAspect.Clear(); - EcsWorld.Clear(); - } - } -} \ No newline at end of file diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 2ce52bb..c59d9cb 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -175,10 +175,6 @@ namespace DCFApixels.DragonECS // тут сложно однозначно посчитать, так как нужно еще место под аспекты и запросы int controllersCount = config.PoolsCapacity * 4; _worldComponentPools = new StructList(controllersCount); - if (controllersCount < _allWorldComponentPools.Capacity) - { - _allWorldComponentPools.Capacity = controllersCount; - } if (worldID < 0 || (worldID == NULL_WORLD_ID && nullWorld == false)) { diff --git a/src/EcsWorld.static.cs b/src/EcsWorld.static.cs index c9b94cf..91699e1 100644 --- a/src/EcsWorld.static.cs +++ b/src/EcsWorld.static.cs @@ -147,10 +147,7 @@ namespace DCFApixels.DragonECS private static short _recycledItemsCount; private static readonly IEcsWorldComponent _interface = EcsWorldComponentHandler.instance; private static readonly Abstract _controller = new Abstract(); - static WorldComponentPool() - { - _allWorldComponentPools.Add(_controller); - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T GetItem(int itemIndex) {// ts @@ -346,10 +343,5 @@ namespace DCFApixels.DragonECS return FindPoolInstance(componentType); } #endregion - - internal static void Clear() - { - _allWorldComponentPools.Clear(); - } } } \ No newline at end of file diff --git a/src/Internal/EcsTypeCodeManager.cs b/src/Internal/EcsTypeCodeManager.cs index b2c2041..ea902a1 100644 --- a/src/Internal/EcsTypeCodeManager.cs +++ b/src/Internal/EcsTypeCodeManager.cs @@ -53,11 +53,6 @@ namespace DCFApixels.DragonECS.Core.Internal return null; } public static IEnumerable GetDeclaredTypes() { return _codes.Select(o => new TypeCodeInfo(o.Key, o.Value)); } - - internal static void Clear() - { - _codes.Clear(); - } } #if ENABLE_IL2CPP [Il2CppSetOption(Option.NullChecks, false)] diff --git a/src/Utils/IConfigContainer.cs b/src/Utils/IConfigContainer.cs index b5a6103..98192f0 100644 --- a/src/Utils/IConfigContainer.cs +++ b/src/Utils/IConfigContainer.cs @@ -102,11 +102,6 @@ namespace DCFApixels.DragonECS { return GetAllConfigs().GetEnumerator(); } - - internal static void Clear() - { - Empty._storage.Clear(); - } } public static class ConfigContainerExtensions {