Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Assets/Framework/Scripts/Infra.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

72 changes: 72 additions & 0 deletions Assets/Framework/Scripts/Utilities/ObjectPool/GameObjectPool.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using UnityEngine;
using UnityEngine.Pool;
using System.Collections;

namespace Framework.Utilities.ObjectPool
{
public class GameobjectPool : IObjectPool<GameObject>
{
private readonly ObjectPool<GameObject> _pool;
private readonly Transform _parent;
private readonly GameObject _prefab;
private readonly int _initializedSize;
private readonly int _maxSize;

public int InitializedSize => _initializedSize;

public int MaxSize => _maxSize;

/// <summary>
/// 仅提供预制体和父节点
/// </summary>
/// <param name="parent"></param>
/// <param name="prefab"></param>
/// <param name="initializedSize"></param>
/// <param name="maxSize"></param>
public GameobjectPool(Transform parent, GameObject prefab, int initializedSize, int maxSize)
{
_parent = parent;
_prefab = prefab;
_initializedSize = initializedSize;
_maxSize = maxSize;

_pool = new ObjectPool<GameObject>(
createFunc: () => Object.Instantiate(_prefab, _parent),
actionOnGet: go => { if (go != null) go.SetActive(true); },
actionOnRelease: go => { if (go != null) { go.SetActive(false); go.transform.SetParent(_parent); } },
actionOnDestroy: obj => { if (obj != null) Object.Destroy(obj); },
collectionCheck: false,
defaultCapacity: initializedSize,
maxSize: maxSize
);
}

public GameObject Create()
{
return _pool.Get();
}

public void Clear()
{
_pool.Clear();
}

public void Destroy(GameObject obj)
{
if (obj != null)
Object.Destroy(obj);
}

public GameObject Get()
{
return _pool.Get();
}

// NOTE: 实现一个回调函数, 实现 After Get

public void Release(GameObject obj)
{
_pool.Release(obj);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Assets/Framework/Scripts/Utilities/ObjectPool/IObjectPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ namespace Framework.Utilities.ObjectPool
{
public interface IObjectPool<T>
{
int InitializedSize { get; }
int MaxSize { get; }

T Get();
T Create();
void Release(T obj);
void Destroy(T obj);
void Clear();
}
}
14 changes: 14 additions & 0 deletions Assets/Framework/Scripts/Utilities/ObjectPool/IPoolManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using UnityEngine;

namespace Framework.Utilities.ObjectPool
{
/// <summary>
/// 工厂方法, 用于管理所有的对象池
/// </summary>
public interface IPoolManager
{
IObjectPool<T> GetPool<T>(string key = null) where T : class;
IObjectPool<T> CreatePool<T>(string key, IObjectPool<T> pool);
bool TryRelease<T>(T item) where T : class;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 56 additions & 0 deletions Assets/Framework/Scripts/Utilities/ObjectPool/PoolManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using System.Collections.Generic;
using Framework.Core.Service;
using UnityEngine;

namespace Framework.Utilities.ObjectPool
{
[Service]
public class PoolManager : IPoolManager
{
private readonly Dictionary<string, object> pools = new();

public IObjectPool<T> CreatePool<T>(string key, IObjectPool<T> pool)
{
if (pools.ContainsKey(Hash(key)))
{
Debug.LogWarning($"Pool already exists for key:{key}");
return pool;
}

pools.Add(Hash(key), pool);

return pool;
}

public IObjectPool<T> GetPool<T>(string key = null) where T : class
{
if (pools.TryGetValue(Hash(key), out var p))
return (IObjectPool<T>)p;
return null;
}

// 自动匹配类型, 尝试释放对象到对应池子
public bool TryRelease<T>(T item) where T : class
{
foreach (var p in pools.Values)
{
if (p is IObjectPool<T> pool)
{
pool.Release(item);
return true;
}
}
return false;
}

/// <summary>
/// 是否要做一层key的映射?使得出现不同类型的池子但是可以有相同名字
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string Hash(string key)
{
return key;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Assets/Framework/Tests/Utilities.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 54 additions & 0 deletions Assets/Framework/Tests/Utilities/PoolManagerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using UnityEngine;
using NUnit.Framework;
using Framework.Core.Service;
using Framework.Utilities.ObjectPool;

namespace Tests
{
public class PoolManagerTests
{
public GameObject prefab;
public GameObject parent;
public ServiceLocator serviceManager;

[SetUp]
public void SetUp()
{
prefab = new GameObject("TestPrefab");
serviceManager = new();
parent = new GameObject("TestParent");
serviceManager.RegisterSingleton(serviceManager);
}

[Test]
public void CreateAndGetPool_Works()
{
var poolManager = serviceManager.Resolve<PoolManager>();
var pool = new GameobjectPool(parent.transform, prefab, 5, 20);
var returnedPool = poolManager.CreatePool("TestPool", pool);
Assert.AreEqual(pool, returnedPool);
var fetchPool = poolManager.GetPool<GameObject>("TestPool");
Assert.AreEqual(pool, fetchPool);
}

[Test]
public void PoolOperation_Works()
{
var poolManager = serviceManager.Resolve<PoolManager>();
var pool = new GameobjectPool(parent.transform, prefab, 5, 20);
poolManager.CreatePool("Op", pool);
var obj = pool.Get();
Assert.IsNotNull(obj);
pool.Release(obj);

var tryReleaseOut = poolManager.TryRelease(obj);
Assert.IsTrue(tryReleaseOut);
}

[TearDown]
public void TearDown()
{
Object.DestroyImmediate(prefab);
}
}
}
2 changes: 2 additions & 0 deletions Assets/Framework/Tests/Utilities/PoolManagerTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading