/// <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]) { long count = FrameStatistics.COUNTERS[i]; var type = (StatisticsCounterType)i; if (!globalStatistics.TryGetValue(type, out var global)) { globalStatistics[type] = global = GlobalStatistics.Get <long>(threadName, type.ToString()); } global.Value = count; currentFrame.Counts[type] = count; currentFrame.FramesPerSecond = Clock.FramesPerSecond; FrameStatistics.COUNTERS[i] = 0; } } if (PendingFrames.Count < max_pending_frames - 1) { PendingFrames.Enqueue(currentFrame); currentFrame = FramesPool.Get(); } 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); } } } double dampRate = Math.Max(Clock.ElapsedFrameTime, 0) / 1000; averageFrameTime = Interpolation.Damp(averageFrameTime, Clock.ElapsedFrameTime, 0.01, dampRate); //check for dropped (stutter) frames traceCollector?.NewFrame(Clock.ElapsedFrameTime, Math.Max(10, Math.Max(1000 / Clock.MaximumUpdateHz, averageFrameTime) * 4)); consumeStopwatchElapsedTime(); }
/// <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(); }