void MainLoop() { renderThreadTime.FrameBegan(); renderThreadTime.TargetFps = TargetFps; Debug.AddValue("rendering / frames rendered", renderThreadTime.FrameCounter); EventSystem.Raise(new MyEngine.Events.FrameStarted()); try { gameWindow.ProcessEvents(); } catch (Exception e) { Log.Error(e); } this.WindowTitle = defaultWindowTitle + " - " + renderThreadTime; Debug.Tick("rendering / main render"); // if window is not focused we dont want to have our character and camera responding to keyboard and mouse inputs if (this.Focused) { Input.Update(); Debug.InputUpdate(); } Debug.LogicUpdate(); EventSystem.Raise(new MyEngine.Events.InputUpdate(renderThreadTime)); EventSystem.Raise(new MyEngine.Events.EventThreadUpdate(renderThreadTime)); if (ShouldContinueRunning == false) { return; } UpdateGPUMemoryInfo(); if (Debug.GetCVar("rendering / debug / reload all shaders").EatBoolIfTrue()) { Factory.ReloadAllShaders(); } ubo.engine.totalElapsedSecondsSinceEngineStart = (float)stopwatchSinceStart.Elapsed.TotalSeconds; ubo.engine.gammaCorrectionTextureRead = Debug.GetCVar("rendering / gamma correction", 2.2f); ubo.engine.gammaCorrectionFinalColor = 1 / ubo.engine.gammaCorrectionTextureRead; //GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); My.Check(); EventSystem.Raise(new MyEngine.Events.PreRenderUpdate(renderThreadTime)); if (PauseRenderPrepare == false) { if (RenderPrepareInOwnThread) { renderManagerBackReady.Wait(); renderManagerBackReady.Reset(); } else { RenderPrepareMain(); } var tmp = renderManagerFront; renderManagerFront = renderManagerBack; renderManagerBack = tmp; if (RenderPrepareInOwnThread) { renderManagerPrepareNext.Set(); } } { var scene = scenes[0]; var camera = scene.MainCamera; var dataToRender = scene.DataToRender; //if (renderThreadTime.FpsPer1Sec > 30) renderManagerFront.SkyboxCubeMap = scene.skyBox; //else renderManagerFront.SkyboxCubeMap = null; renderManagerFront.RenderAll(camera, ubo, dataToRender.Lights, camera.postProcessEffects); } if (ShouldContinueRunning == false) { return; } gameWindow.SwapBuffers(); EventSystem.Raise(new MyEngine.Events.PostRenderUpdate(renderThreadTime)); //GC.Collect(); Mesh.ProcessFinalizerQueue(); EventSystem.Raise(new MyEngine.Events.FrameEnded(renderThreadTime)); if (Debug.GetCVar("rendering / fps / automatically adjust target fps", false)) { if (renderThreadTime.FrameCounter > TargetFps.Number * 10 && renderThreadTime.FpsPer10Sec < TargetFps) { TargetFps.Number = (float)renderThreadTime.FpsPer1Sec; Debug.AddValue("rendering / fps / adjusted target fps", TargetFps.Number); } } if (Debug.GetCVar("rendering / fps / fps throttling enabled", false)) { var targetFps = TargetFps * 1.2; var secondsWeCanSleep = 1 / targetFps - renderThreadTime.CurrentFrameElapsedSeconds; if (secondsWeCanSleep > 0) { Debug.AddValue("rendering /fps / theoretical unthrottled fps", renderThreadTime.CurrentFrameElapsedTimeFps + " fps"); Thread.Sleep((1000 * secondsWeCanSleep).FloorToInt()); } } }