Esempio n. 1
0
 /// <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;
 }
Esempio n. 2
0
 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;
     //        //
     //}
 }
Esempio n. 3
0
        /// <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);
                }
            }

        }
Esempio n. 4
0
 /// <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;
 }
Esempio n. 5
0
 //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);
 }
Esempio n. 6
0
        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;

        }
Esempio n. 7
0
 /// <summary>
 /// 线程安全
 /// </summary>
 /// <param name="buf"></param>
 public static void FreeBuf(BufferListSegment buf) {
     //lock (m_lockObj) {
     BufPool.Free(buf);
     //}
 }