Use object pools instead of allocating new lists

This commit is contained in:
wrenge 2024-11-12 14:47:57 +03:00
parent 3e754529e5
commit c0b916a0d1
2 changed files with 38 additions and 1 deletions

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
namespace DotRecast.Core.Buffers
{
// This implementation is thread unsafe
public class RcObjectPool<T> where T : class
{
private readonly Queue<T> _items = new Queue<T>();
private readonly Func<T> _createFunc;
public RcObjectPool(Func<T> createFunc)
{
_createFunc = createFunc;
}
public T Get()
{
if (_items.TryDequeue(out var result))
return result;
return _createFunc();
}
public void Return(T obj)
{
_items.Enqueue(obj);
}
}
}

View File

@ -21,6 +21,7 @@ freely, subject to the following restrictions:
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using DotRecast.Core.Buffers;
namespace DotRecast.Detour namespace DotRecast.Detour
{ {
@ -31,10 +32,12 @@ namespace DotRecast.Detour
private int m_usedNodesCount; private int m_usedNodesCount;
private List<DtNode[]> m_buckets; private List<DtNode[]> m_buckets;
private readonly int m_initialBufferCapacityBase; private readonly int m_initialBufferCapacityBase;
private readonly RcObjectPool<List<DtNode>> m_listPool;
public DtNodePool(int initialBufferCapacityBase = 6) // initial size 64 public DtNodePool(int initialBufferCapacityBase = 6) // initial size 64
{ {
m_map = new Dictionary<long, List<DtNode>>(); m_map = new Dictionary<long, List<DtNode>>();
m_listPool = new RcObjectPool<List<DtNode>>(() => new List<DtNode>());
m_buckets = new List<DtNode[]>(); m_buckets = new List<DtNode[]>();
m_initialBufferCapacityBase = initialBufferCapacityBase; m_initialBufferCapacityBase = initialBufferCapacityBase;
} }
@ -78,6 +81,9 @@ namespace DotRecast.Detour
public void Clear() public void Clear()
{ {
foreach (var pair in m_map)
m_listPool.Return(pair.Value);
m_map.Clear(); m_map.Clear();
m_usedNodesCount = 0; m_usedNodesCount = 0;
} }
@ -124,7 +130,8 @@ namespace DotRecast.Detour
} }
else else
{ {
nodes = new List<DtNode>(); nodes = m_listPool.Get();
nodes.Clear();
m_map.Add(id, nodes); m_map.Add(id, nodes);
} }