// 返却 public void Push(FramePacket packet) { lock (this) { pool.AddFront(packet); } }
// リクエストされたサイズ以上のバッファを返す。 public FramePacket GetDataBuffer(int size) { lock (this) { // TODO: 1回だけでいいの? if (pool.Count > 0) { FramePacket candidate = pool.RemoveFront(); if (candidate == null) { Debug.LogError("candidate is null! returns new buffer."); return(GetNewBuffer(size)); } else { if (candidate.Buffer == null) { Debug.LogError("candidate.Buffer is null!"); } } if (candidate.Buffer.Length > size) { return(candidate); } } } return(GetNewBuffer(size)); }
// バッファをプールから取り出し、さらにデータをコピーして渡す public FramePacket GetDataBufferWithContents(int width, int height, byte[] src, int size) { FramePacket dest = GetDataBuffer(size); System.Array.Copy(src, 0, dest.Buffer, 0, size); dest.width = width; dest.height = height; return(dest); }
public void Push(FramePacket frame) { frameLoad.Track(); FramePacket trashBuf = null; lock (this) { frames.AddFront(frame); if (frames.Count >= maxQueueCount) { frameSkip.Track(); trashBuf = frames.RemoveBack(); } } // lock内でPushしないのは、thisとbufferPoolの両方のlockを同時にとらないようにする配慮。 if (trashBuf != null) { bufferPool.Push(trashBuf); } }
public void Pool(FramePacket buf) { bufferPool.Push(buf); }
private FramePacket GetNewBuffer(int neededSize) { FramePacket packet = new FramePacket((int)(neededSize * 1.2)); return(packet); }