private static void StaticReset(int frameIndex, RenderManager renderManager) { if (_LastFrameStaticReset >= frameIndex) { return; } // Any buffers that remain unused (either from being too small, or being unnecessary now) // should be disposed. XNABufferPair <TVertex> hb; using (var e = _UnusedHardwareBuffers.GetEnumerator()) while (e.GetNext(out hb)) { hb.Age += 1; bool shouldKill = (hb.Age >= MaxBufferAge) || ((_UnusedHardwareBuffers.Count > MaxUnusedBuffers) && (hb.Age > 1)); if (shouldKill) { e.RemoveCurrent(); hb.Invalidate(frameIndex); renderManager.DisposeResource(hb); } } _LastFrameStaticReset = frameIndex; }
void IBufferGenerator.Reset() { lock (_StateLock) { _FillingHardwareBufferEntry = null; _FlushedToBuffers = 0; _VertexCount = _IndexCount = 0; // Any buffers that remain unused (either from being too small, or being unnecessary now) // should be disposed. THardwareBuffer hb; using (var e = _UnusedHardwareBuffers.GetEnumerator()) while (e.GetNext(out hb)) { hb.Age += 1; bool shouldKill = (hb.Age >= MaxBufferAge) || ((_UnusedHardwareBuffers.Count > MaxUnusedBuffers) && (hb.Age > 1)); if (shouldKill) { e.RemoveCurrent(); hb.Invalidate(); DisposeResource(hb); } } // Return any buffers that were used this frame to the unused state. foreach (var _hb in _UsedHardwareBuffers) { // HACK var hwb = _hb.Buffer; hwb.Invalidate(); _UnusedHardwareBuffers.Add(hwb); } _UsedHardwareBuffers.Clear(); foreach (var swb in _SoftwareBuffers) { swb.Uninitialize(); _SoftwareBufferPool.Release(swb); } _SoftwareBuffers.Clear(); /* * Array.Clear(_VertexArray, 0, _VertexArray.Length); * Array.Clear(_IndexArray, 0, _IndexArray.Length); */ } }
void IBufferGenerator.Flush() { lock (_StateLock) { if (_FlushedToBuffers == 0) { if (_PendingCopies.Count > 0) { PendingCopy pc; using (var e = _PendingCopies.GetEnumerator()) while (e.GetNext(out pc)) { pc.Execute(); } _PendingCopies.Clear(); } FlushToBuffers(); } else { throw new InvalidOperationException("Buffer generator flushed twice in a row"); } } }
private static void StaticReset(int frameIndex, RenderManager renderManager) { if (_LastFrameStaticReset >= frameIndex) { return; } // Any buffers that remain unused (either from being too small, or being unnecessary now) // should be disposed. XNABufferPair <TVertex> hb; using (var e = _UnusedHardwareBuffers.GetEnumerator()) while (e.GetNext(out hb)) { hb.Age += 1; int usedCount = hb.IsLarge ? _LargeUnusedBufferCount : _SmallUnusedBufferCount; int usedLimit = hb.IsLarge ? MaxLargeUnusedBuffers : MaxSmallUnusedBuffers; bool shouldKill = (!hb.ProtectedFromDeath && (hb.Age >= MaxBufferAge)) || ((usedCount > usedLimit) && (hb.Age > 1)); if (shouldKill) { e.RemoveCurrent(); hb.Invalidate(frameIndex); if (hb.IsLarge) { _LargeUnusedBufferCount--; } else { _SmallUnusedBufferCount--; } renderManager.DisposeResource(hb); } } _LastFrameStaticReset = frameIndex; }
public void MutableEnumerator () { var l = new UnorderedList<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); using (var e = l.GetEnumerator()) while (e.MoveNext()) { if ((e.Current % 2) == 0) e.RemoveCurrent(); } Assert.AreEqual( new int[] { 1, 9, 3, 7, 5 }, l.ToArray() ); }
public void MutableEnumeratorRemoveCurrentAndGetNext() { var l = new UnorderedList<int>(); l.Add(1); l.Add(2); int item; using (var e = l.GetEnumerator()) while (e.GetNext(out item)) e.RemoveCurrent(); Assert.AreEqual( new int[] { }, l.ToArray() ); }
public bool TryCancel() { if (this == Null) { return(false); } if (Children != null) { CancellationScope childScope; using (var e = Children.GetEnumerator()) while (e.GetNext(out childScope)) { childScope.TryCancel(); } } var wasCanceled = _IsCanceled; _IsCanceled = true; if (Task == null) { return(false); } switch (Task.Status) { case TaskStatus.Canceled: case TaskStatus.Faulted: return(true); case TaskStatus.RanToCompletion: return(false); } return(true); }