public bool TryGetTextureFrame(out TextureFrame outFrame) { TextureFrame nextFrame = null; lock (((ICollection)_availableTextureFrames).SyncRoot) { if (_poolSize <= frameCount) { while (_availableTextureFrames.Count > 0) { var textureFrame = _availableTextureFrames.Dequeue(); if (!IsStale(textureFrame)) { nextFrame = textureFrame; break; } } } else { nextFrame = CreateNewTextureFrame(); } } if (nextFrame == null) { outFrame = null; return(false); } lock (((ICollection)_textureFramesInUse).SyncRoot) { _textureFramesInUse.Add(nextFrame.GetInstanceID(), nextFrame); } nextFrame.WaitUntilReleased(); outFrame = nextFrame; return(true); }
IEnumerator YieldTextureFrame(Action <TextureFrame> callback) { TextureFrame nextFrame = null; lock (((ICollection)availableTextureFrames).SyncRoot) { yield return(new WaitUntil(() => { return poolSize > frameCount || availableTextureFrames.Count > 0; })); if (poolSize <= frameCount) { while (availableTextureFrames.Count > 0) { var textureFrame = availableTextureFrames.Dequeue(); if (!IsStale(textureFrame)) { nextFrame = textureFrame; break; } } } if (nextFrame == null) { nextFrame = CreateNewTextureFrame(); } } lock (((ICollection)textureFramesInUse).SyncRoot) { textureFramesInUse.Add(nextFrame.GetInstanceID(), nextFrame); } nextFrame.WaitUntilReleased(); callback(nextFrame); yield return(nextFrame); }