2026-04-21 14:24:36 +08:00
|
|
|
|
using System;
|
2026-04-27 14:38:24 +08:00
|
|
|
|
using System.Runtime.CompilerServices;
|
2025-10-11 15:18:09 +08:00
|
|
|
|
|
|
|
|
|
|
namespace AlicizaX
|
|
|
|
|
|
{
|
|
|
|
|
|
public static partial class MemoryPool
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
private static bool _enableStrictCheck;
|
2026-04-23 18:18:27 +08:00
|
|
|
|
private static int _strictCheckVersion;
|
2025-10-11 15:18:09 +08:00
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static bool EnableStrictCheck
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _enableStrictCheck;
|
2026-04-23 18:18:27 +08:00
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_enableStrictCheck == value)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
_enableStrictCheck = value;
|
|
|
|
|
|
_strictCheckVersion++;
|
|
|
|
|
|
}
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-23 18:18:27 +08:00
|
|
|
|
internal static int StrictCheckVersion => _strictCheckVersion;
|
|
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
2026-04-21 14:24:36 +08:00
|
|
|
|
public static int Count => MemoryPoolRegistry.Count;
|
2025-10-11 15:18:09 +08:00
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static MemoryPoolInfo[] GetAllMemoryPoolInfos()
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
return MemoryPoolRegistry.GetAllInfos();
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
2026-04-27 14:38:24 +08:00
|
|
|
|
#endif
|
2025-10-11 15:18:09 +08:00
|
|
|
|
|
2026-04-23 19:09:56 +08:00
|
|
|
|
public static int GetAllMemoryPoolInfos(MemoryPoolInfo[] infos)
|
|
|
|
|
|
{
|
|
|
|
|
|
return MemoryPoolRegistry.GetAllInfos(infos);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static void ClearAll()
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPoolRegistry.ClearAll();
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static T Acquire<T>() where T : class, IMemory, new()
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
return MemoryPool<T>.Acquire();
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-28 11:31:58 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取动态内存类型的缓存句柄。运行时热路径应提前缓存该句柄,避免反复使用 Type 查找。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
|
public static MemoryPoolHandle GetHandle(Type memoryType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return MemoryPoolRegistry.GetHandle(memoryType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 慢速动态路径。禁止在运行时热路径调用;请提前通过 GetHandle(Type) 缓存 MemoryPoolHandle 后再获取对象。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Obsolete("慢速动态路径,禁止在运行时热路径使用。请缓存 MemoryPoolHandle,或改用 MemoryPool<T>.Acquire / MemoryPool.Acquire<T>。", false)]
|
2026-04-27 14:38:24 +08:00
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static IMemory Acquire(Type memoryType)
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
return MemoryPoolRegistry.Acquire(memoryType);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
|
public static void Release<T>(T memory) where T : class, IMemory, new()
|
|
|
|
|
|
{
|
|
|
|
|
|
MemoryPool<T>.Release(memory);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-28 11:31:58 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 慢速动态路径。禁止在运行时热路径调用;请通过缓存的 MemoryPoolHandle 或 Release<T> 回收对象。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Obsolete("慢速动态路径,禁止在运行时热路径使用。请通过缓存的 MemoryPoolHandle,或改用 MemoryPool<T>.Release / MemoryPool.Release<T>。", false)]
|
2026-04-27 14:38:24 +08:00
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static void Release(IMemory memory)
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPoolRegistry.Release(memory);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void Add<T>(int count) where T : class, IMemory, new()
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPool<T>.Prewarm(count);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void Add(Type memoryType, int count)
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPoolRegistry.Prewarm(memoryType, count);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-21 14:24:36 +08:00
|
|
|
|
public static void Remove<T>(int count) where T : class, IMemory, new()
|
2025-10-11 15:18:09 +08:00
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
int target = MemoryPool<T>.UnusedCount - count;
|
|
|
|
|
|
MemoryPool<T>.Shrink(target);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void Remove(Type memoryType, int count)
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPoolRegistry.RemoveFromType(memoryType, count);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-21 14:24:36 +08:00
|
|
|
|
public static void RemoveAll<T>() where T : class, IMemory, new()
|
2025-10-11 15:18:09 +08:00
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPool<T>.ClearAll();
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-27 14:38:24 +08:00
|
|
|
|
public static void SetCapacity<T>(int softCapacity, int hardCapacity) where T : class, IMemory, new()
|
|
|
|
|
|
{
|
|
|
|
|
|
MemoryPool<T>.SetCapacity(softCapacity, hardCapacity);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void Compact<T>() where T : class, IMemory, new()
|
|
|
|
|
|
{
|
|
|
|
|
|
MemoryPool<T>.Compact();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void Compact(Type memoryType)
|
|
|
|
|
|
{
|
|
|
|
|
|
MemoryPoolRegistry.CompactType(memoryType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void CompactAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
MemoryPoolRegistry.CompactAll();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-11 15:18:09 +08:00
|
|
|
|
public static void RemoveAll(Type memoryType)
|
|
|
|
|
|
{
|
2026-04-21 14:24:36 +08:00
|
|
|
|
MemoryPoolRegistry.ClearType(memoryType);
|
2025-10-11 15:18:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|