Pull up CategorizedPool. Add Reset method for ObjectPool.

This commit is contained in:
2023-02-11 23:08:43 +08:00
parent b364005741
commit 9fd685b8b3
7 changed files with 90 additions and 69 deletions

View File

@@ -1,6 +1,5 @@
using Cryville.Common;
using Cryville.Common.Buffers;
using System.Collections.Generic;
namespace Cryville.Crtr.Event {
internal class MotionCache {
@@ -11,7 +10,7 @@ namespace Cryville.Crtr.Event {
Value.CopyTo(dest.Value);
}
}
internal class MotionCachePool {
internal class MotionCachePool : CategorizedPool<Identifier, MotionCache> {
private class Bucket : ObjectPool<MotionCache> {
readonly MotionRegistry _reg;
public Bucket(string name, int capacity) : base(capacity) {
@@ -22,35 +21,13 @@ namespace Cryville.Crtr.Event {
result.Value = (Vector)ReflectionHelper.InvokeEmptyConstructor(_reg.Type);
return result;
}
protected override void Reset(MotionCache obj) {
obj.Valid = false;
}
}
static Dictionary<Identifier, Bucket> _buckets;
public static void Prepare() {
_buckets = new Dictionary<Identifier, Bucket>(ChartPlayer.motionRegistry.Count);
public MotionCachePool() {
foreach (var reg in ChartPlayer.motionRegistry)
_buckets.Add(reg.Key, new Bucket(reg.Key, 4096));
}
static readonly SimpleObjectPool<Dictionary<MotionCache, Identifier>> _dictPool
= new SimpleObjectPool<Dictionary<MotionCache, Identifier>>(1024);
Dictionary<MotionCache, Identifier> _rented;
public MotionCache Rent(Identifier name) {
var obj = _buckets[name].Rent();
obj.Valid = false;
if (_rented == null) _rented = _dictPool.Rent();
_rented.Add(obj, name);
return obj;
}
public void Return(MotionCache obj) {
_buckets[_rented[obj]].Return(obj);
_rented.Remove(obj);
}
public void ReturnAll() {
if (_rented == null) return;
foreach (var obj in _rented)
_buckets[obj.Value].Return(obj.Key);
_rented.Clear();
_dictPool.Return(_rented);
_rented = null;
Buckets.Add(reg.Key, new Bucket(reg.Key, 4096));
}
}
}