NetPacketPool.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA_8_1
  2. using System;
  3. using System.Collections.Generic;
  4. using FlyingWormConsole3.LiteNetLib.Utils;
  5. namespace FlyingWormConsole3.LiteNetLib
  6. {
  7. internal class NetPacketPool
  8. {
  9. private readonly Stack<NetPacket> _pool;
  10. public NetPacketPool()
  11. {
  12. _pool = new Stack<NetPacket>();
  13. }
  14. public NetPacket GetWithData(PacketProperty property, NetDataWriter writer)
  15. {
  16. var packet = Get(property, writer.Length);
  17. Buffer.BlockCopy(writer.Data, 0, packet.RawData, NetPacket.GetHeaderSize(property), writer.Length);
  18. return packet;
  19. }
  20. public NetPacket GetWithData(PacketProperty property, byte[] data, int start, int length)
  21. {
  22. var packet = Get(property, length);
  23. Buffer.BlockCopy(data, start, packet.RawData, NetPacket.GetHeaderSize(property), length);
  24. return packet;
  25. }
  26. //Get packet just for read
  27. public NetPacket GetAndRead(byte[] data, int start, int count)
  28. {
  29. NetPacket packet = null;
  30. lock (_pool)
  31. {
  32. if (_pool.Count > 0)
  33. {
  34. packet = _pool.Pop();
  35. }
  36. }
  37. if (packet == null)
  38. {
  39. //allocate new packet of max size or bigger
  40. packet = new NetPacket(NetConstants.MaxPacketSize);
  41. }
  42. if (!packet.FromBytes(data, start, count))
  43. {
  44. Recycle(packet);
  45. return null;
  46. }
  47. return packet;
  48. }
  49. //Get packet with size
  50. public NetPacket Get(PacketProperty property, int size)
  51. {
  52. NetPacket packet = null;
  53. size += NetPacket.GetHeaderSize(property);
  54. if (size <= NetConstants.MaxPacketSize)
  55. {
  56. lock (_pool)
  57. {
  58. if (_pool.Count > 0)
  59. {
  60. packet = _pool.Pop();
  61. }
  62. }
  63. }
  64. if (packet == null)
  65. {
  66. //allocate new packet of max size or bigger
  67. packet = new NetPacket(size > NetConstants.MaxPacketSize ? size : NetConstants.MaxPacketSize);
  68. }
  69. else
  70. {
  71. Array.Clear(packet.RawData, 0, size);
  72. }
  73. packet.Property = property;
  74. packet.Size = size;
  75. return packet;
  76. }
  77. public void Recycle(NetPacket packet)
  78. {
  79. if (packet.Size > NetConstants.MaxPacketSize)
  80. {
  81. //Dont pool big packets. Save memory
  82. return;
  83. }
  84. //Clean fragmented flag
  85. packet.IsFragmented = false;
  86. lock (_pool)
  87. {
  88. _pool.Push(packet);
  89. }
  90. }
  91. }
  92. }
  93. #endif