/// <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; } }
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); }
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; }
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; // } }
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); }
/// <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; // } // }
/// <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); }