public void ToggleMetering(int frameCount) { if (meterFrameCount == 0) { MeterManager.ClearEvents(); pendingMeterFrameCount = frameCount; } else { // Set it to 1 so we'll stop metering at the end of the next frame meterFrameCount = 1; } }
/// <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(); } } } }