/// <summary> /// 数据取出后就从当前列表中移除 /// </summary> /// <param name="len"></param> /// <returns></returns> public BufferListStream getBytesTo(int len) { if (available() < len) return null; if (Count < 1) return null; BufferListStream bs = new BufferListStream(); int offset = 0; while (offset < len) { BufferListSegment seg = this.m_List[0]; if (offset + seg.Count > len) { var level = BufferListPoolMgr.CaculBufLevel(seg.Count); var buf = BufferListPoolMgr.AllocBuf(level); //Buffer.BlockCopy(seg.Array, seg.Offset, buf.Array, buf.Offset, len - offset); buf.SetDataFast(seg.Array, seg.Offset, buf.Offset, len - offset); updateOffset(seg.Offset + (len - offset)); // bs.Add(buf); break; } else { //Buffer.BlockCopy(seg.Array, seg.Offset, buf, 0, seg.Count); offset += seg.Count; this.m_List.RemoveAt(0); //回收seg 如果不是通过BufferListPoolMgr申请的byte[] 并且长度不是64偶数倍(最大64)的数据将直接丢弃,由GC回收 //BufferListPoolMgr.FreeBuf(seg.Array); bs.Add(seg); } } return bs; }
public void Free(BufferListSegment buf) { //缓存限制数量,防止内存无止境增涨 //Array.Clear(buf.Source.Array, buf.Source.Offset, buf.Source.Count); //if (buf.IsFromBufferListPool == false) { //buf内部自己已经判断 // return; //} buf.ReleaseBuffer(); //设置最大缓存80M数据 //switch (buf.Level) { // case BufferLevel.b128: // //内部已经执行Array.Clear(...) // buf.ReleaseBuffer(Buffer128b); // break; // case BufferLevel.b256: // buf.ReleaseBuffer(Buffer256b); // break; // case BufferLevel.b512: // buf.ReleaseBuffer(Buffer512b); // break; // case BufferLevel.k1: // buf.ReleaseBuffer(Buffer1k); // break; // case BufferLevel.k2: // buf.ReleaseBuffer(Buffer2k); // break; // case BufferLevel.k4: // buf.ReleaseBuffer(Buffer4k); // break; // case BufferLevel.k8: // buf.ReleaseBuffer(Buffer8k); // break; // case BufferLevel.k16: // buf.ReleaseBuffer(Buffer16k); // break; // case BufferLevel.k32: // buf.ReleaseBuffer(Buffer32k); // break; // case BufferLevel.k64: // buf.ReleaseBuffer(Buffer64k); // break; // // //} }
/// <summary> /// 数据取出后就从当前列表中移除 /// </summary> /// <param name="fill2Data">填充数组,外面保证其剩余长度有效性</param> /// <param name="fill2BuffOffset"></param> /// <param name="len">外面保证取长度的有效性</param> public void getBytes(ref byte[] fill2Data, int fill2BuffOffset, int len) { if (available() < len) return; if (fill2Data.Length - fill2BuffOffset < len) return; if (Count < 1) return; //填充到数组 int offset = 0; while (offset < len) { BufferListSegment seg = this.m_List[0]; if (offset + seg.Count > len) { Buffer.BlockCopy(seg.Array, seg.Offset, fill2Data, offset + fill2BuffOffset, len - offset); updateOffset(seg.Offset + (len - offset)); break; } else { Buffer.BlockCopy(seg.Array, seg.Offset, fill2Data, offset + fill2BuffOffset, seg.Count); offset += seg.Count; this.m_List.RemoveAt(0); //回收seg 如果不是通过ByteListPoolMgr申请的byte[] 并且长度不是64偶数倍(最大64)的数据将直接丢弃,由GC回收 BufferListPoolMgr.FreeBuf(seg); } } }
/// <summary> /// 数据取出后就从当前列表中移除 /// </summary> /// <param name="len"></param> /// <returns></returns> public byte[] getBytes(int len) { if (available() < len) return null; if (Count < 1) return null; byte[] data = new byte[len]; int offset = 0; while (offset < data.Length) { BufferListSegment seg = this.m_List[0]; if (offset + seg.Count > len) { Buffer.BlockCopy(seg.Array, seg.Offset, data, offset, len - offset); updateOffset(seg.Offset + (len - offset)); return data; } else { Buffer.BlockCopy(seg.Array, seg.Offset, data, offset, seg.Count); offset += seg.Count; this.m_List.RemoveAt(0); //回收seg( 如果是规范内的buf长度 128b/256b/512b/1024b/...) //如果不是通过 BufferListPoolMgr.FreeBuf(seg); } } // UnityEngine.Debug.Log("EXIT LOOP????!??!?!?!?? "); return data; }
//public IList<BufferListSegment> GetAllCachedItems() { // return m_List; //} //public IEnumerator<BufferListSegment> GetEnumerator() { // int length = m_List.Count; // for (int i = 0; i < length; i++) { // yield return m_List[i]; // } //} //IEnumerator IEnumerable.GetEnumerator() { // return GetEnumerator(); //} public void Add(BufferListSegment item) { m_List.Add(item); }
public BufferListSegment GetBuf(BufferLevel level) { BufferListSegment seg = null; ArraySegment<byte> buf = new ArraySegment<byte>(); switch (level) { case BufferLevel.b128: buf = this.Buffer128b.GetBuffer(128); seg = new BufferListSegment(level, buf, this.Buffer128b); // break; case BufferLevel.b256: buf = this.Buffer256b.GetBuffer(256); seg = new BufferListSegment(level, buf, this.Buffer256b); // break; case BufferLevel.b512: buf = this.Buffer512b.GetBuffer(512); seg = new BufferListSegment(level, buf, this.Buffer512b); // break; case BufferLevel.k1: buf = this.Buffer1k.GetBuffer(1024); seg = new BufferListSegment(level, buf, this.Buffer1k); // break; case BufferLevel.k2: buf = this.Buffer2k.GetBuffer(1024 * 2); seg = new BufferListSegment(level, buf, this.Buffer2k); // break; case BufferLevel.k4: buf = this.Buffer4k.GetBuffer(1024 * 4); seg = new BufferListSegment(level, buf, this.Buffer4k); // break; case BufferLevel.k8: buf = this.Buffer8k.GetBuffer(1024 * 8); seg = new BufferListSegment(level, buf, this.Buffer8k); // break; case BufferLevel.k16: buf = this.Buffer16k.GetBuffer(1024 * 16); seg = new BufferListSegment(level, buf, this.Buffer16k); // break; case BufferLevel.k32: buf = this.Buffer32k.GetBuffer(1024 * 32); seg = new BufferListSegment(level, buf, this.Buffer32k); // break; case BufferLevel.k64: buf = this.Buffer64k.GetBuffer(1024 * 64); seg = new BufferListSegment(level, buf, this.Buffer64k); // break; // } if (buf.Array == null) { //todo:超出缓存,取不出来 switch (level) { case BufferLevel.b128: buf = new ArraySegment<byte>(new byte[128]); // break; case BufferLevel.b256: buf = new ArraySegment<byte>(new byte[256]); // break; case BufferLevel.b512: buf = new ArraySegment<byte>(new byte[512]); // break; case BufferLevel.k1: buf = new ArraySegment<byte>(new byte[1024]); // break; case BufferLevel.k2: buf = new ArraySegment<byte>(new byte[1024 * 2]); // break; case BufferLevel.k4: buf = new ArraySegment<byte>(new byte[1024 * 4]); // break; case BufferLevel.k8: buf = new ArraySegment<byte>(new byte[1024 * 8]); // break; case BufferLevel.k16: buf = new ArraySegment<byte>(new byte[1024 * 16]); // break; case BufferLevel.k32: buf = new ArraySegment<byte>(new byte[1024 * 32]); // break; case BufferLevel.k64: buf = new ArraySegment<byte>(new byte[1024 * 64]); // break; // } seg = new BufferListSegment(level, buf, null); } return seg; }
/// <summary> /// 线程安全 /// </summary> /// <param name="buf"></param> public static void FreeBuf(BufferListSegment buf) { //lock (m_lockObj) { BufPool.Free(buf); //} }