From fae94c020a2d13443418b38f02f4cf199d3be920 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:13:44 +0800 Subject: [PATCH] refactoring --- ...ectAttribute.cs => InjectionAttributes.cs} | 0 ...te.cs.meta => InjectionAttributes.cs.meta} | 0 src/AutoInjectSystem.cs | 75 ++++++------------- src/Utils/DummyInstance.cs | 24 ++++++ src/Utils/DummyInstance.cs.meta | 11 +++ 5 files changed, 59 insertions(+), 51 deletions(-) rename src/Attributes/{EcsInjectAttribute.cs => InjectionAttributes.cs} (100%) rename src/Attributes/{EcsInjectAttribute.cs.meta => InjectionAttributes.cs.meta} (100%) create mode 100644 src/Utils/DummyInstance.cs create mode 100644 src/Utils/DummyInstance.cs.meta diff --git a/src/Attributes/EcsInjectAttribute.cs b/src/Attributes/InjectionAttributes.cs similarity index 100% rename from src/Attributes/EcsInjectAttribute.cs rename to src/Attributes/InjectionAttributes.cs diff --git a/src/Attributes/EcsInjectAttribute.cs.meta b/src/Attributes/InjectionAttributes.cs.meta similarity index 100% rename from src/Attributes/EcsInjectAttribute.cs.meta rename to src/Attributes/InjectionAttributes.cs.meta diff --git a/src/AutoInjectSystem.cs b/src/AutoInjectSystem.cs index 3ae908b..6a21075 100644 --- a/src/AutoInjectSystem.cs +++ b/src/AutoInjectSystem.cs @@ -5,18 +5,15 @@ using System.Reflection; namespace DCFApixels.DragonECS { - internal static class DummyInstance - { - public static T intsance = (T)Activator.CreateInstance(typeof(T)); - } internal class AutoInjectionMap { private readonly EcsPipeline _source; private Dictionary> _systemProoperties; private HashSet _notInjected; - private Type _dummyInstance = typeof(DummyInstance<>); private bool _isDummyInjected = false; + private bool _isPreInitInjectionComplete = false; + public AutoInjectionMap(EcsPipeline source) { _source = source; @@ -84,7 +81,9 @@ namespace DCFApixels.DragonECS } public void Inject(Type fieldType, object obj) { - _notInjected.Remove(fieldType); + if (!_isPreInitInjectionComplete) + _notInjected.Remove(fieldType); + Type baseType = fieldType.BaseType; if (baseType != null) Inject(baseType, obj); @@ -114,9 +113,7 @@ namespace DCFApixels.DragonECS EcsDebug.Print(EcsConsts.DEBUG_ERROR_TAG, $"The {systemRecord.Attribute.notNullDummyType} dummy cannot be assigned to the {systemRecord.property.PropertyType.Name} field"); continue; } - - systemRecord.property.Inject(systemRecord.target, - _dummyInstance.MakeGenericType(systemRecord.Attribute.notNullDummyType).GetField("intsance", BindingFlags.Static | BindingFlags.Public).GetValue(null)); + systemRecord.property.Inject(systemRecord.target, DummyInstance.GetInstance(systemRecord.Attribute.notNullDummyType)); } } WarningMissedInjections(); @@ -135,6 +132,11 @@ namespace DCFApixels.DragonECS #endif } + public void OnPreInitInjectionComplete() + { + _isPreInitInjectionComplete = true; + } + private readonly struct InjectedPropertyRecord { public readonly IEcsProcess target; @@ -149,58 +151,29 @@ namespace DCFApixels.DragonECS } [DebugHide, DebugColor(DebugColor.Gray)] - public class AutoInjectSystem : IEcsPreInitProcess, IEcsPreInject, IEcsPreInitInjectProcess + public class AutoInjectSystem : IEcsPreInject, IEcsInject, IEcsPreInitInjectProcess { private EcsPipeline _pipeline; - private List _injectQueue = new List(); + private List _delayedInjects = new List(); private AutoInjectionMap _autoInjectionMap; - private bool _isPreInjectionComplete = false; + public void Inject(EcsPipeline obj) => _pipeline = obj; public void PreInject(object obj) { - if (_pipeline == null) - { - _injectQueue.Add(obj); - return; - } - AutoInject(obj); + _delayedInjects.Add(obj); } - public void PreInit(EcsPipeline pipeline) - { - _pipeline = pipeline; - _autoInjectionMap = new AutoInjectionMap(_pipeline); - - foreach (var obj in _injectQueue) - { - AutoInject(obj); - } - _injectQueue.Clear(); - _injectQueue = null; - if (_isPreInjectionComplete) - { - _autoInjectionMap.InjectDummy(); - } - } - - private void AutoInject(object obj) - { - _autoInjectionMap.Inject(obj.GetType(), obj); - } - public void OnPreInitInjectionBefore() { } public void OnPreInitInjectionAfter() { - _isPreInjectionComplete = true; - if (_autoInjectionMap != null) - { - _autoInjectionMap.InjectDummy(); - } - ClearUsless(); - } + _autoInjectionMap = new AutoInjectionMap(_pipeline); - private void ClearUsless() - { - _autoInjectionMap = null; - GC.Collect(0); //Собрать все хламовые мини классы созданне временно + foreach (var obj in _delayedInjects) + _autoInjectionMap.Inject(obj.GetType(), obj); + _autoInjectionMap.InjectDummy(); + _autoInjectionMap.OnPreInitInjectionComplete(); + + _delayedInjects.Clear(); + _delayedInjects = null; + GC.Collect(0); } } diff --git a/src/Utils/DummyInstance.cs b/src/Utils/DummyInstance.cs new file mode 100644 index 0000000..e0ad9bc --- /dev/null +++ b/src/Utils/DummyInstance.cs @@ -0,0 +1,24 @@ +п»їusing System; +using System.Reflection; + +namespace DCFApixels.DragonECS +{ +#if UNITY_2020_3_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + internal static class DummyInstance + { +#if UNITY_2020_3_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static T intsance = (T)Activator.CreateInstance(typeof(T)); + } + internal static class DummyInstance + { + private static Type _dummyInstance = typeof(DummyInstance<>); + public static object GetInstance(Type type) + { + return _dummyInstance.MakeGenericType(type).GetField("intsance", BindingFlags.Static | BindingFlags.Public).GetValue(null); + } + } +} diff --git a/src/Utils/DummyInstance.cs.meta b/src/Utils/DummyInstance.cs.meta new file mode 100644 index 0000000..4c1c4d3 --- /dev/null +++ b/src/Utils/DummyInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f09b27bf655bd04fa96bf5905d12a45 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: