using System; namespace Mirror { /// Pooled NetworkReader, automatically returned to pool when using 'using' public sealed class PooledNetworkReader : NetworkReader, IDisposable { internal PooledNetworkReader(byte[] bytes) : base(bytes) {} internal PooledNetworkReader(ArraySegment segment) : base(segment) {} public void Dispose() => NetworkReaderPool.Recycle(this); } /// Pool of NetworkReaders to avoid allocations. public static class NetworkReaderPool { // reuse Pool // we still wrap it in NetworkReaderPool.Get/Recyle so we can reset the // position and array before reusing. static readonly Pool Pool = new Pool( // byte[] will be assigned in GetReader () => new PooledNetworkReader(new byte[]{}), // initial capacity to avoid allocations in the first few frames 1000 ); /// Get the next reader in the pool. If pool is empty, creates a new Reader public static PooledNetworkReader GetReader(byte[] bytes) { // grab from pool & set buffer PooledNetworkReader reader = Pool.Take(); reader.SetBuffer(bytes); return reader; } /// Get the next reader in the pool. If pool is empty, creates a new Reader public static PooledNetworkReader GetReader(ArraySegment segment) { // grab from pool & set buffer PooledNetworkReader reader = Pool.Take(); reader.SetBuffer(segment); return reader; } /// Returns a reader to the pool. public static void Recycle(PooledNetworkReader reader) { Pool.Return(reader); } } }