| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA_8_1
- using System;
- using System.Collections.Generic;
- using FlyingWormConsole3.LiteNetLib.Utils;
- namespace FlyingWormConsole3.LiteNetLib
- {
- internal class NetPacketPool
- {
- private readonly Stack<NetPacket> _pool;
- public NetPacketPool()
- {
- _pool = new Stack<NetPacket>();
- }
- public NetPacket GetWithData(PacketProperty property, NetDataWriter writer)
- {
- var packet = Get(property, writer.Length);
- Buffer.BlockCopy(writer.Data, 0, packet.RawData, NetPacket.GetHeaderSize(property), writer.Length);
- return packet;
- }
- public NetPacket GetWithData(PacketProperty property, byte[] data, int start, int length)
- {
- var packet = Get(property, length);
- Buffer.BlockCopy(data, start, packet.RawData, NetPacket.GetHeaderSize(property), length);
- return packet;
- }
- //Get packet just for read
- public NetPacket GetAndRead(byte[] data, int start, int count)
- {
- NetPacket packet = null;
- lock (_pool)
- {
- if (_pool.Count > 0)
- {
- packet = _pool.Pop();
- }
- }
- if (packet == null)
- {
- //allocate new packet of max size or bigger
- packet = new NetPacket(NetConstants.MaxPacketSize);
- }
- if (!packet.FromBytes(data, start, count))
- {
- Recycle(packet);
- return null;
- }
- return packet;
- }
- //Get packet with size
- public NetPacket Get(PacketProperty property, int size)
- {
- NetPacket packet = null;
- size += NetPacket.GetHeaderSize(property);
- if (size <= NetConstants.MaxPacketSize)
- {
- lock (_pool)
- {
- if (_pool.Count > 0)
- {
- packet = _pool.Pop();
- }
- }
- }
- if (packet == null)
- {
- //allocate new packet of max size or bigger
- packet = new NetPacket(size > NetConstants.MaxPacketSize ? size : NetConstants.MaxPacketSize);
- }
- else
- {
- Array.Clear(packet.RawData, 0, size);
- }
- packet.Property = property;
- packet.Size = size;
- return packet;
- }
- public void Recycle(NetPacket packet)
- {
- if (packet.Size > NetConstants.MaxPacketSize)
- {
- //Dont pool big packets. Save memory
- return;
- }
- //Clean fragmented flag
- packet.IsFragmented = false;
- lock (_pool)
- {
- _pool.Push(packet);
- }
- }
- }
- }
- #endif
|