69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.Managing;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Runtime.CompilerServices;
 | |
| 
 | |
| namespace FishNet.Serializing
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Reader which is reused to save on garbage collection and performance.
 | |
|     /// </summary>
 | |
|     public sealed class PooledReader : Reader, IDisposable
 | |
|     {
 | |
|         internal PooledReader(byte[] bytes, NetworkManager networkManager) : base(bytes, networkManager) { }
 | |
|         internal PooledReader(ArraySegment<byte> segment, NetworkManager networkManager) : base(segment, networkManager) { }
 | |
|         public void Dispose() => ReaderPool.Recycle(this);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Collection of PooledReader. Stores and gets PooledReader.
 | |
|     /// </summary>
 | |
|     public static class ReaderPool
 | |
|     {
 | |
|         #region Private.
 | |
|         /// <summary>
 | |
|         /// Pool of readers.
 | |
|         /// </summary>
 | |
|         private static readonly Stack<PooledReader> _pool = new Stack<PooledReader>();
 | |
|         #endregion
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Get the next reader in the pool
 | |
|         /// <para>If pool is empty, creates a new Reader</para>
 | |
|         /// </summary>
 | |
|         [MethodImpl(MethodImplOptions.AggressiveInlining)]
 | |
|         public static PooledReader GetReader(byte[] bytes, NetworkManager networkManager)
 | |
|         {
 | |
|             return GetReader(new ArraySegment<byte>(bytes), networkManager);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Get the next reader in the pool or creates a new one if none are available.
 | |
|         /// </summary>
 | |
|         public static PooledReader GetReader(ArraySegment<byte> segment, NetworkManager networkManager)
 | |
|         {
 | |
|             PooledReader result;
 | |
|             if (_pool.Count > 0)
 | |
|             {
 | |
|                 result = _pool.Pop();
 | |
|                 result.Initialize(segment, networkManager);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 result = new PooledReader(segment, networkManager);
 | |
|             }
 | |
| 
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Puts reader back into pool
 | |
|         /// <para>When pool is full, the extra reader is left for the GC</para>
 | |
|         /// </summary>
 | |
|         public static void Recycle(PooledReader reader)
 | |
|         {
 | |
|             _pool.Push(reader);
 | |
|         }
 | |
|     }
 | |
| }
 |