From 4b7649e80c00bdb19f4d94fe1c7367f1fe04f25c Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 25 Jun 2023 23:22:01 +0800 Subject: [PATCH] split EcsWorld --- src/EcsWorld.cs | 92 --------------------------------- src/EcsWorld.static.cs | 100 ++++++++++++++++++++++++++++++++++++ src/EcsWorld.static.cs.meta | 11 ++++ 3 files changed, 111 insertions(+), 92 deletions(-) create mode 100644 src/EcsWorld.static.cs create mode 100644 src/EcsWorld.static.cs.meta diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 4d3b758..7ab71dc 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -3,101 +3,9 @@ using DCFApixels.DragonECS.Utils; using System; using System.Collections.Generic; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; namespace DCFApixels.DragonECS { - [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 4)] - public struct EcsWorldCmp where T : struct - { - private int _worldID; - public EcsWorldCmp(int worldID) => _worldID = worldID; - public EcsWorld World => EcsWorld.GetWorld(_worldID); - public ref T Value => ref EcsWorld.GetData(_worldID); - } - public abstract partial class EcsWorld - { - private const short GEN_BITS = 0x7fff; - private const short DEATH_GEN_BIT = short.MinValue; - private const int DEL_ENT_BUFFER_SIZE_OFFSET = 2; - - private static EcsWorld[] Worlds = new EcsWorld[4]; - private static IntDispenser _worldIdDispenser = new IntDispenser(0); - - private static List _dataReleaseres = new List(); - - static EcsWorld() - { - Worlds[0] = new EcsNullWorld(); - } - private static void ReleaseData(int worldID) - { - for (int i = 0, iMax = _dataReleaseres.Count; i < iMax; i++) - _dataReleaseres[i].Release(worldID); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static EcsWorld GetWorld(int worldID) => Worlds[worldID]; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ref T GetData(int worldID) => ref WorldComponentPool.GetForWorld(worldID); - - private abstract class DataReleaser - { - public abstract void Release(int worldID); - } - private static class WorldComponentPool - { - private static T[] _items = new T[4]; - private static int[] _mapping = new int[4]; - private static int _count; - private static int[] _recycledItems = new int[4]; - private static int _recycledItemsCount; - private static IEcsWorldComponent _interface = EcsWorldComponentHandler.instance; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ref T Get(int itemIndex) => ref _items[itemIndex]; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ref T GetForWorld(int worldID) => ref _items[GetItemIndex(worldID)]; - public static int GetItemIndex(int worldID) - { - if (_mapping.Length < Worlds.Length) - Array.Resize(ref _mapping, Worlds.Length); - - ref int itemIndex = ref _mapping[worldID]; - if (itemIndex <= 0) - { - if (_recycledItemsCount > 0) - { - _count++; - itemIndex = _recycledItems[--_recycledItemsCount]; - } - else - { - itemIndex = ++_count; - } - _interface.Init(ref _items[itemIndex], Worlds[worldID]); - _dataReleaseres.Add(new Releaser()); - } - return itemIndex; - } - private static void Release(int worldID) - { - ref int itemIndex = ref _mapping[worldID]; - if (itemIndex != 0) - { - _interface.OnDestroy(ref _items[itemIndex], Worlds[worldID]); - _recycledItems[_recycledItemsCount++] = itemIndex; - } - } - private sealed class Releaser : DataReleaser - { - public sealed override void Release(int worldID) - { - WorldComponentPool.Release(worldID); - } - } - } - } public abstract partial class EcsWorld { public readonly short id; diff --git a/src/EcsWorld.static.cs b/src/EcsWorld.static.cs new file mode 100644 index 0000000..d5e69af --- /dev/null +++ b/src/EcsWorld.static.cs @@ -0,0 +1,100 @@ +using DCFApixels.DragonECS.Utils; +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace DCFApixels.DragonECS +{ + [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 4)] + public struct EcsWorldCmp where T : struct + { + private int _worldID; + public EcsWorldCmp(int worldID) => _worldID = worldID; + public EcsWorld World => EcsWorld.GetWorld(_worldID); + public ref T Value => ref EcsWorld.GetData(_worldID); + } + public abstract partial class EcsWorld + { + private const short GEN_BITS = 0x7fff; + private const short DEATH_GEN_BIT = short.MinValue; + private const int DEL_ENT_BUFFER_SIZE_OFFSET = 2; + + private static EcsWorld[] Worlds = new EcsWorld[4]; + private static IntDispenser _worldIdDispenser = new IntDispenser(0); + + private static List _dataReleaseres = new List(); + + static EcsWorld() + { + Worlds[0] = new EcsNullWorld(); + } + private static void ReleaseData(int worldID) + { + for (int i = 0, iMax = _dataReleaseres.Count; i < iMax; i++) + _dataReleaseres[i].Release(worldID); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static EcsWorld GetWorld(int worldID) => Worlds[worldID]; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref T GetData(int worldID) => ref WorldComponentPool.GetForWorld(worldID); + + private abstract class DataReleaser + { + public abstract void Release(int worldID); + } + private static class WorldComponentPool + { + private static T[] _items = new T[4]; + private static int[] _mapping = new int[4]; + private static int _count; + private static int[] _recycledItems = new int[4]; + private static int _recycledItemsCount; + private static IEcsWorldComponent _interface = EcsWorldComponentHandler.instance; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref T Get(int itemIndex) => ref _items[itemIndex]; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref T GetForWorld(int worldID) => ref _items[GetItemIndex(worldID)]; + public static int GetItemIndex(int worldID) + { + if (_mapping.Length < Worlds.Length) + Array.Resize(ref _mapping, Worlds.Length); + + ref int itemIndex = ref _mapping[worldID]; + if (itemIndex <= 0) + { + if (_recycledItemsCount > 0) + { + _count++; + itemIndex = _recycledItems[--_recycledItemsCount]; + } + else + { + itemIndex = ++_count; + } + _interface.Init(ref _items[itemIndex], Worlds[worldID]); + _dataReleaseres.Add(new Releaser()); + } + return itemIndex; + } + private static void Release(int worldID) + { + ref int itemIndex = ref _mapping[worldID]; + if (itemIndex != 0) + { + _interface.OnDestroy(ref _items[itemIndex], Worlds[worldID]); + _recycledItems[_recycledItemsCount++] = itemIndex; + } + } + private sealed class Releaser : DataReleaser + { + public sealed override void Release(int worldID) + { + WorldComponentPool.Release(worldID); + } + } + } + } +} diff --git a/src/EcsWorld.static.cs.meta b/src/EcsWorld.static.cs.meta new file mode 100644 index 0000000..d99ff4b --- /dev/null +++ b/src/EcsWorld.static.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 30c8fd4d7c5aeae4486e16024b4f50cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: