public void Render(float blend = 1)
        {
            bool shouldrender = _invalidated ||
                                Canvas.NeedsRedraw ||
                                (Track.PlaybackMode) ||
                                Loading ||
                                Track.NeedsDraw ||
                                SelectedTool.NeedsRender;

            _invalidated = false;
            if (shouldrender)
            {
                BeginOrtho();
                var slider = Canvas.Scrubber;
                if (blend == 1 && Settings.SmoothPlayback && Track.Playing && !slider.Held)
                {
                    blend = Math.Min(1, (float)Scheduler.ElapsedPercent);
                    if (ReversePlayback)
                    {
                        blend = 1 - blend;
                    }
                    Track.Camera.BeginFrame(blend, Track.Zoom);
                }
                else
                {
                    Track.Camera.BeginFrame(blend, Track.Zoom);
                }
                GL.ClearColor(Settings.NightMode
                   ? Constants.ColorNightMode
                   : (Settings.WhiteBG ? Constants.ColorWhite : Constants.ColorOffwhite));
                MSAABuffer.Use(RenderSize.Width, RenderSize.Height);
                GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
                GL.Clear(ClearBufferMask.ColorBufferBit);
                GL.Enable(EnableCap.Blend);
                GL.Disable(EnableCap.Lighting);

#if debuggrid
                if (this.Keyboard.GetState().IsKeyDown(Key.C))
                {
                    GameRenderer.DbgDrawGrid();
                }
#endif
                Track.Render(blend);
#if debugcamera
                if (this.Keyboard.GetState().IsKeyDown(Key.C))
                {
                    GameRenderer.DbgDrawCamera();
                }
#endif
                SelectedTool.Render();
                Canvas.RenderCanvas();
                MSAABuffer.End();

                if (Settings.NightMode)
                {
                    StaticRenderer.RenderRect(new FloatRect(0, 0, RenderSize.Width, RenderSize.Height), Color.FromArgb(40, 0, 0, 0));
                }
                SwapBuffers();
                //there are machines and cases where a refresh may not hit the screen without calling glfinish...
                GL.Finish();
                var seconds = Track.FramerateWatch.Elapsed.TotalSeconds;
                Track.FramerateCounter.AddFrame(seconds);
                Track.FramerateWatch.Restart();
            }
            if (!Track.Playing &&
                !Canvas.NeedsRedraw &&
                !Track.NeedsDraw &&
                !SelectedTool.Active)//if nothing is waiting on us we can let the os breathe
            {
                Thread.Sleep(10);
            }
        }