コード例 #1
0
ファイル: BufferGenerator.cs プロジェクト: jli94/Fracture
        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;
        }
コード例 #2
0
        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);
                 */
            }
        }
コード例 #3
0
        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");
                }
            }
        }
コード例 #4
0
        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;
        }
コード例 #5
0
        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()
            );
        }
コード例 #6
0
ファイル: UnorderedListTests.cs プロジェクト: sq/Fracture
        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()
            );
        }
コード例 #7
0
ファイル: CancellationScope.cs プロジェクト: jli94/Fracture
        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);
        }