/// <summary> /// Resets all frame statistics. Run exactly once per frame. /// </summary> public void NewFrame() { // Reset the counters we keep track of for (int i = 0; i < activeCounters.Length; ++i) { if (activeCounters[i]) { currentFrame.Counts[(StatisticsCounterType)i] = FrameStatistics.COUNTERS[i]; FrameStatistics.COUNTERS[i] = 0; } } PendingFrames.Enqueue(currentFrame); if (PendingFrames.Count >= max_pending_frames) { FrameStatistics oldFrame; PendingFrames.TryDequeue(out oldFrame); FramesHeap.FreeObject(oldFrame); } currentFrame = FramesHeap.ReserveObject(); currentFrame.Clear(); if (HandleGC) { for (int i = 0; i < lastAmountGarbageCollects.Length; ++i) { int amountCollections = GC.CollectionCount(i); if (lastAmountGarbageCollects[i] != amountCollections) { lastAmountGarbageCollects[i] = amountCollections; currentFrame.GarbageCollections.Add(i); } } } //check for dropped (stutter) frames traceCollector.NewFrame(Clock.ElapsedFrameTime, Math.Max(10, Math.Max(1000 / Clock.MaximumUpdateHz, AverageFrameTime) * 4)); //reset frame totals currentCollectionTypeStack.Clear(); consumeStopwatchElapsedTime(); }
internal PerformanceMonitor(GameThread thread, IEnumerable <StatisticsCounterType> counters) { Clock = thread.Clock; threadName = thread.Name; isActive = thread.IsActive.GetBoundCopy(); isActive.BindValueChanged(_ => updateEnabledState()); currentFrame = FramesPool.Get(); foreach (var c in counters) { ActiveCounters[(int)c] = true; } for (int i = 0; i < FrameStatistics.NUM_PERFORMANCE_COLLECTION_TYPES; i++) { var t = (PerformanceCollectionType)i; endCollectionDelegates[i] = new InvokeOnDisposal(() => endCollecting(t)); } }
/// <summary> /// Resets all frame statistics. Run exactly once per frame. /// </summary> internal void NewFrame() { if (currentFrame != null) { PendingFrames.Enqueue(currentFrame); if (PendingFrames.Count > 100) { FrameStatistics oldFrame; PendingFrames.TryDequeue(out oldFrame); } } currentFrame = FramesHeap.ReserveObject(); currentFrame.Clear(); if (HandleGC) { for (int i = 0; i < lastAmountGarbageCollects.Length; ++i) { int amountCollections = GC.CollectionCount(i); if (lastAmountGarbageCollects[i] != amountCollections) { lastAmountGarbageCollects[i] = amountCollections; currentFrame.GarbageCollections.Add(i); } } } //check for dropped (stutter) frames if (Clock.ElapsedFrameTime > spikeTime) { NewDroppedFrame(); } //reset frame totals CurrentCollectionTypeStack.Clear(); //backgroundMonitorStackTrace = null; consumeStopwatchElapsedTime(); }