using System; using System.Runtime.CompilerServices; namespace Mirror { /// Pooled NetworkWriter, automatically returned to pool when using 'using' public sealed class PooledNetworkWriter : NetworkWriter, IDisposable { public void Dispose() => NetworkWriterPool.Recycle(this); } /// Pool of NetworkWriters to avoid allocations. public static class NetworkWriterPool { // reuse Pool // we still wrap it in NetworkWriterPool.Get/Recycle so we can reset the // position before reusing. // this is also more consistent with NetworkReaderPool where we need to // assign the internal buffer before reusing. static readonly Pool Pool = new Pool( () => new PooledNetworkWriter(), // initial capacity to avoid allocations in the first few frames // 1000 * 1200 bytes = around 1 MB. 1000 ); /// Get a writer from the pool. Creates new one if pool is empty. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PooledNetworkWriter GetWriter() { // grab from pool & reset position PooledNetworkWriter writer = Pool.Take(); writer.Reset(); return writer; } /// Return a writer to the pool. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Recycle(PooledNetworkWriter writer) { Pool.Return(writer); } } }