public void EndScene(object sender, EventArgs args) { if (!_statsEnabled) { return; } _renderFinished.Reset(); try { TimeSpan guiDur = DateTime.Now - _frameRenderingStartTime; _totalGuiRenderDuration += guiDur; _guiRenderDuration += guiDur; _totalFrameCount++; _frameCount++; int scanLine = _device.GetRasterStatus(0).ScanLine; _sumMsToVBlank += ScanlineToVblankOffset(scanLine); _fpsCounter++; TimeSpan ts = DateTime.Now - _fpsTimer; float secs = (float)ts.TotalSeconds; _fps = _fpsCounter / secs; Stats currentFrameStats = new Stats { Fps = _fps, MsFrameRenderTime = (float)guiDur.TotalMilliseconds, MsToNextVBlank = ScanlineToVblankOffset(scanLine) }; if (ts.TotalSeconds >= 1.0f) { float totalAvgGuiTime = (float)_totalGuiRenderDuration.TotalMilliseconds / _totalFrameCount; float avgGuiTime = (float)_guiRenderDuration.TotalMilliseconds / _frameCount; float avgMsToVBlank = _sumMsToVBlank / _frameCount; int glitches; _perfLogString = string.Format( "Render: {0:0.00} fps [red], {1} frames last meas., avg GUI time {2:0.00}, last sec: {3:0.00} [blue], " + "avg ms to vblank: {6:0.00} [grn]\r\nRender mode enabled: {4}\r\n{5}", _fps, _fpsCounter, totalAvgGuiTime, avgGuiTime, SkinContext.RenderStrategy.Name, GetPresentStats(out glitches), avgMsToVBlank); currentFrameStats.Glitch = glitches; _perfLogString += "\r\n" + GetScreenInfo(); _perfLogString += "\r\n" + GetRenderPipelineInfo(); _perfLogString += "\r\n" + GetPlayerInfos(); _fpsCounter = 0; _frameCount = 0; _guiRenderDuration = TimeSpan.Zero; _fpsTimer = DateTime.Now; _sumMsToVBlank = 0; } _stats.Push(currentFrameStats); DrawLines(); DrawTearingTest(); DrawText(_perfLogString); } finally { _renderFinished.Set(); } }