public bool ToggleMeteringLongestFrame() { bool value = false; if (meterLongestFrame) { if (longestFrameMeterEvents != null) { MeterManager.Report("Longest Frame", longestFrameMeterEvents); longestFrameMeterEvents = null; value = true; } } longestFrameTime = 0; meterLongestFrame = !meterLongestFrame; return(value); }
/// <summary> /// Starts the default rendering loop. /// </summary> public void StartRendering() { bool cachedMeterLongestFrame = false; int frameStartTime = 0; Debug.Assert(activeRenderSystem != null, "Engine cannot start rendering without an active RenderSystem."); activeRenderSystem.InitRenderTargets(); // initialize the vars lastStartTime = lastEndTime = timer.Milliseconds; // reset to false so that rendering can begin queuedEnd = false; while (!queuedEnd) { // Make sure we're collecting if it's called for if (meterFrameCount > 0) { MeterManager.Collecting = true; } else if (meterLongestFrame) { cachedMeterLongestFrame = true; MeterManager.Collecting = true; frameStartTime = System.Environment.TickCount; } // allow OS events to process (if the platform requires it frameMeter.Enter(); eventMeter.Enter(); PlatformManager.Instance.DoEvents(); eventMeter.Exit(); if (suspendRendering) { Thread.Sleep(100); frameMeter.Exit(); continue; } renderMeter.Enter(); RenderOneFrame(); renderMeter.Exit(); if (activeRenderSystem.RenderTargetCount == 0) { QueueEndRendering(); } frameMeter.Exit(); // Turn metering on or off, and generate the report if // we're done if (meterFrameCount > 0) { meterFrameCount--; if (meterFrameCount == 0) { MeterManager.Collecting = false; MeterManager.Report("Frame Processing"); } } else if (pendingMeterFrameCount > 0) { // We'll start metering next frame meterFrameCount = pendingMeterFrameCount; pendingMeterFrameCount = 0; } else if (cachedMeterLongestFrame) { MeterManager.Collecting = false; int frameTime = System.Environment.TickCount - frameStartTime; if (frameTime > longestFrameTime) { longestFrameTime = frameTime; longestFrameMeterEvents = MeterManager.ReturnEvents(); } else { MeterManager.ClearEvents(); } } } }