using Cryville.Common; using Cryville.Common.Buffers; using System.Collections.Generic; namespace Cryville.Crtr.Event { internal class RMVPool { private class Bucket : ObjectPool { readonly MotionRegistry _reg; public Bucket(string name, int capacity) : base(capacity) { _reg = ChartPlayer.motionRegistry[name]; } protected override RealtimeMotionValue Construct() { return new RealtimeMotionValue().Init(_reg.InitValue); } } static Dictionary _buckets; public static void Prepare() { _buckets = new Dictionary(ChartPlayer.motionRegistry.Count); foreach (var reg in ChartPlayer.motionRegistry) _buckets.Add(reg.Key, new Bucket(reg.Key, 4096)); } static readonly SimpleObjectPool> _dictPool = new SimpleObjectPool>(1024); Dictionary _rented; public RealtimeMotionValue Rent(Identifier name) { var obj = _buckets[name].Rent(); if (_rented == null) _rented = _dictPool.Rent(); _rented.Add(obj, name); return obj; } public void Return(RealtimeMotionValue 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); } } }