예제 #1
0
 /// <summary>
 /// 设置指定缓存容量的 缓存倍数,如果编写程序中命中的缓存级别较大,可单独增加缓存数量
 /// </summary>
 /// <param name="level"></param>
 /// <param name="multiple"></param>
 public void SetCacheMultiple(BufferLevel level, byte multiple) {
     switch (level) {
         case BufferLevel.b128:
             Buffer128b.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.b256:
             Buffer256b.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.b512:
             Buffer512b.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k1:
             Buffer1k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k2:
             Buffer2k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k4:
             Buffer4k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k8:
             Buffer4k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k16:
             Buffer8k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k32:
             Buffer16k.SetPageSizeMaxMultiple(multiple);
             break;
         case BufferLevel.k64:
             Buffer64k.SetPageSizeMaxMultiple(multiple);
             break;
     }
 }
예제 #2
0
        public void Free(byte[] buf)
        {
            BufferLevel level = BufferLevel.None;

            switch (buf.Length)
            {
            case 128:
                level = BufferLevel.b128;
                break;

            case 256:
                level = BufferLevel.b256;
                break;

            case 512:
                level = BufferLevel.b512;
                break;

            case 1024:
                level = BufferLevel.k1;
                break;

            case 2048:
                level = BufferLevel.k2;
                break;

            case 4096:
                level = BufferLevel.k4;
                break;

            case 8192:
                level = BufferLevel.k8;
                break;

            case 16384:
                level = BufferLevel.k16;
                break;

            case 32768:
                level = BufferLevel.k32;
                break;

            case 65536:
                level = BufferLevel.k64;
                break;
            }
            //不是规范内的buf不回收,直接丢弃
            _recyle(buf, level);
        }
예제 #3
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;

        }
예제 #4
0
        private void _recyle(byte[] buf, BufferLevel level)
        {
            //缓存限制数量,防止内存无止境增涨
            Array.Clear(buf, 0, buf.Length);
            //设置最大缓存80M数据
            switch (level)
            {
            case BufferLevel.b128:
                if (Buffer128b.Count > 1024 * 64 * m_cacheMultiple)
                {
                    //超出数量范围(8M) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer128b.Enqueue(buf);
                break;

            case BufferLevel.b256:
                if (Buffer256b.Count > 1024 * 32 * m_cacheMultiple)
                {
                    //超出数量范围(8M) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer256b.Enqueue(buf);
                break;

            case BufferLevel.b512:
                if (Buffer512b.Count > 1024 * 16 * m_cacheMultiple)
                {
                    //超出数量范围(8M) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer512b.Enqueue(buf);
                break;

            case BufferLevel.k1:
                if (Buffer1k.Count > 1024 * 8 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer1k.Enqueue(buf);
                break;

            case BufferLevel.k2:
                if (Buffer2k.Count > 1024 * 4 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer2k.Enqueue(buf);
                break;

            case BufferLevel.k4:
                if (Buffer4k.Count > 1024 * 2 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer4k.Enqueue(buf);
                break;

            case BufferLevel.k8:
                if (Buffer8k.Count > 1024 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer8k.Enqueue(buf);
                break;

            case BufferLevel.k16:
                if (Buffer16k.Count > 512 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer16k.Enqueue(buf);
                break;

            case BufferLevel.k32:
                if (Buffer32k.Count > 256 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer32k.Enqueue(buf);
                break;

            case BufferLevel.k64:
                if (Buffer64k.Count > 128 * m_cacheMultiple)
                {
                    //超出数量范围(8m) 直接GC
#if DEBUG
                    //UnityEngine.Debug.LogWarning("##ByteListPool##_recyle:" + level.ToString());
#endif
                    break;
                }
                Buffer64k.Enqueue(buf);
                break;
                //
            }
        }
예제 #5
0
        public byte[] GetBuf(BufferLevel level)
        {
            byte[] buf = null;
            switch (level)
            {
            case BufferLevel.b128:
                if (Buffer128b.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer128b.Dequeue();
                //
                break;

            case BufferLevel.b256:
                if (Buffer256b.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer256b.Dequeue();
                //
                break;

            case BufferLevel.b512:
                if (Buffer512b.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer512b.Dequeue();
                //
                break;

            case BufferLevel.k1:
                if (Buffer1k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer1k.Dequeue();
                //
                break;

            case BufferLevel.k2:
                if (Buffer2k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer2k.Dequeue();
                //
                break;

            case BufferLevel.k4:
                if (Buffer4k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer4k.Dequeue();
                //
                break;

            case BufferLevel.k8:
                if (Buffer8k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer8k.Dequeue();
                //
                break;

            case BufferLevel.k16:
                if (Buffer16k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer16k.Dequeue();
                //
                break;

            case BufferLevel.k32:
                if (Buffer32k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer32k.Dequeue();
                //
                break;

            case BufferLevel.k64:
                if (Buffer64k.Count == 0)
                {
                    _addBuf(level);
                }
                buf = this.Buffer64k.Dequeue();
                //
                break;
                //
            }
            return(buf);
        }
예제 #6
0
        /// <summary>
        /// 添加一次是512K数据
        /// </summary>
        /// <param name="level"></param>
        private void _addBuf(BufferLevel level)
        {
#if DEBUG
            //UnityEngine.Debug.LogWarning("##ByteListPool##_addBuf:" + level.ToString());
#endif
            switch (level)
            {
            case BufferLevel.b128:
                for (int i = 0; i < 4096; i++)
                {
                    //系统会尽量申请地址连续的内存(512K)
                    Buffer128b.Enqueue(new byte[128]);
                }
                break;

            case BufferLevel.b256:
                for (int i = 0; i < 2048; i++)
                {
                    Buffer256b.Enqueue(new byte[256]);
                }
                break;

            case BufferLevel.b512:
                for (int i = 0; i < 1024; i++)
                {
                    Buffer512b.Enqueue(new byte[512]);
                }
                break;

            case BufferLevel.k1:
                for (int i = 0; i < 512; i++)
                {
                    Buffer1k.Enqueue(new byte[1024]);
                }
                break;

            case BufferLevel.k2:
                for (int i = 0; i < 256; i++)
                {
                    Buffer2k.Enqueue(new byte[1024 * 2]);
                }
                break;

            case BufferLevel.k4:
                for (int i = 0; i < 128; i++)
                {
                    Buffer4k.Enqueue(new byte[1024 * 4]);
                }
                break;

            case BufferLevel.k8:
                for (int i = 0; i < 64; i++)
                {
                    Buffer8k.Enqueue(new byte[1024 * 8]);
                }
                break;

            case BufferLevel.k16:
                for (int i = 0; i < 32; i++)
                {
                    Buffer16k.Enqueue(new byte[1024 * 16]);
                }
                break;

            case BufferLevel.k32:
                for (int i = 0; i < 16; i++)
                {
                    Buffer32k.Enqueue(new byte[1024 * 32]);
                }
                break;

            case BufferLevel.k64:
                for (int i = 0; i < 8; i++)
                {
                    Buffer64k.Enqueue(new byte[1024 * 64]);
                }
                break;
                //
            }
            //
        }
예제 #7
0
 /// <summary>
 /// 设置指定缓存容量的 缓存倍数,如果编写程序中命中的缓存级别较大,可单独增加缓存数量
 /// </summary>
 /// <param name="level"></param>
 /// <param name="multiple"></param>
 public void SetCacheMultiple(BufferLevel level, byte multiple)
 {
     m_cacheMultiples[level] = Math.Max(1, (int)multiple);
 }