コード例 #1
0
ファイル: BufferListStream.cs プロジェクト: RainsSoft/uNet2
 protected void Dispose(bool Disposing) {
     if (m_IsDispose) {
         return;
     }
     m_IsDispose = true;
     //if (Disposing) {
     //主动释放,则回收
     for (int i = this.Count - 1; i >= 0; i--) {
         BufferListPoolMgr.FreeBuf(this.m_List[i]);
     }
     this.m_List.Clear();
     //}
 }
コード例 #2
0
ファイル: BufferListStream.cs プロジェクト: RainsSoft/uNet2
        /// <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);
                }
            }

        }
コード例 #3
0
ファイル: BufferListStream.cs プロジェクト: RainsSoft/uNet2
 /// <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;
 }