diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs
new file mode 100644
index 00000000..d8e2dc05
--- /dev/null
+++ b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs
@@ -0,0 +1,350 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using YooAsset;
+
+namespace TEngine
+{
+ ///
+ /// 资源组数据。
+ /// DisposeGroup。
+ ///
+ public class LruAssetGroup : IMemory
+ {
+ private const int DefaultCapacity = 48;
+ private readonly LruCacheTable _lruCacheTable;
+
+ public LruAssetGroup()
+ {
+ _lruCacheTable = new LruCacheTable(DefaultCapacity, OnAdd, OnRemove);
+ }
+
+ private void OnAdd(AssetHandleData assetHandleData)
+ {
+ }
+
+ private void OnRemove(AssetHandleData assetHandleData)
+ {
+ MemoryPool.Release(assetHandleData);
+ }
+
+ ///
+ /// 引用资源数据到资源组内。
+ ///
+ /// 资源操作句柄。
+ /// 资源标识。
+ /// 是否注册成功。
+ public bool Reference(AssetOperationHandle handle, string assetTag = "")
+ {
+ AssetHandleData handleData = AssetHandleData.Alloc(handle, assetTag);
+ _lruCacheTable.Put(handleData.Handle.GetAssetInfo().Address,handleData);
+ return true;
+ }
+
+ ///
+ /// 从资源组内释放资源数据。
+ ///
+ /// 资源操作句柄。
+ /// 是否释放成功。
+ public bool Release(AssetOperationHandle handle)
+ {
+ _lruCacheTable.Remove(handle.GetAssetInfo().Address);
+ return true;
+ }
+
+ public void Clear()
+ {
+ _lruCacheTable.Clear();
+ }
+
+ ///
+ /// 从内存池中获取资源分组数据。
+ ///
+ /// 资源分组数据。
+ public static LruAssetGroup Alloc()
+ {
+ LruAssetGroup assetGroup = MemoryPool.Acquire();
+
+ return assetGroup;
+ }
+
+ ///
+ /// 将内存对象归还内存池。
+ ///
+ ///
+ public static void Release(LruAssetGroup assetGroup)
+ {
+ if (assetGroup == null)
+ {
+ Log.Fatal("Release AssetGroup Failed !");
+ return;
+ }
+
+ MemoryPool.Release(assetGroup);
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 要加载资源的类型。
+ /// 资源实例。
+ public T LoadAsset(string assetName) where T : Object
+ {
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ var data = _lruCacheTable.Get(assetName);
+ if (data != null)
+ {
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = data.Handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return data.Handle.AssetObject as T;
+ }
+ }
+
+ AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName);
+
+ Reference(handle);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return handle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 父节点位置。
+ /// 要加载资源的类型。
+ /// 资源实例。
+ public T LoadAsset(string assetName, Transform parent) where T : Object
+ {
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ var data = _lruCacheTable.Get(assetName);
+ if (data != null)
+ {
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = data.Handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return data.Handle.AssetObject as T;
+ }
+ }
+
+ AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName);
+
+ Reference(handle);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = handle.InstantiateSync(parent);
+ return ret as T;
+ }
+ else
+ {
+ return handle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 要加载资源的类型。
+ /// 资源操作句柄。
+ /// 资源实例。
+ public T LoadAsset(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object
+ {
+ assetOperationHandle = null;
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ var data = _lruCacheTable.Get(assetName);
+ if (data != null)
+ {
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = data.Handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return data.Handle.AssetObject as T;
+ }
+ }
+
+
+ assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName);
+
+ Reference(assetOperationHandle);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = assetOperationHandle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return assetOperationHandle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 父节点位置。
+ /// 资源操作句柄。
+ /// 要加载资源的类型。
+ /// 资源实例。
+ public T LoadAsset(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle)
+ where T : Object
+ {
+ assetOperationHandle = null;
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ var data = _lruCacheTable.Get(assetName);
+ if (data != null)
+ {
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = data.Handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return data.Handle.AssetObject as T;
+ }
+ }
+
+ assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName);
+
+ Reference(assetOperationHandle);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = assetOperationHandle.InstantiateSync(parent);
+ return ret as T;
+ }
+ else
+ {
+ return assetOperationHandle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 异步加载资源实例。
+ ///
+ /// 要加载的实例名称。
+ /// 取消操作Token。
+ /// 资源操作句柄。
+ /// 资源实实例。
+ // ReSharper disable once UnusedParameter.Global
+ // ReSharper disable once RedundantAssignment
+ public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken,
+ AssetOperationHandle assetOperationHandle = null) where T : Object
+ {
+
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ var data = _lruCacheTable.Get(assetName);
+ if (data != null)
+ {
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = data.Handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return data.Handle.AssetObject as T;
+ }
+ }
+
+ AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName);
+
+ Reference(handle);
+
+ bool cancelOrFailed =
+ await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
+
+ if (cancelOrFailed)
+ {
+ Release(handle);
+
+ return null;
+ }
+
+ assetOperationHandle = handle;
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return handle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 异步加载游戏物体。
+ ///
+ /// 要加载的游戏物体名称。
+ /// 取消操作Token。
+ /// 异步游戏物体实例。
+ public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
+ {
+ return await LoadAssetAsync(assetName, cancellationToken);
+ }
+
+ ///
+ /// 异步加载游戏物体。
+ ///
+ /// 要加载的游戏物体名称。
+ /// 取消操作Token。
+ /// 资源操作句柄。
+ /// 异步游戏物体实例。
+ public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken,
+ AssetOperationHandle assetOperationHandle)
+ {
+ return await LoadAssetAsync(assetName, cancellationToken, assetOperationHandle);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta
new file mode 100644
index 00000000..bd54fe60
--- /dev/null
+++ b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 00d66c24e74646e8a798cf3f9b6f68c3
+timeCreated: 1683897392
\ No newline at end of file