|
|
|
@ -3,6 +3,7 @@ |
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Diagnostics.CodeAnalysis; |
|
|
|
using System.Linq; |
|
|
|
using Perspex.Media; |
|
|
|
@ -20,6 +21,11 @@ namespace Perspex.Rendering |
|
|
|
[SuppressMessage("ReSharper", "ForCanBeConvertedToForeach")] |
|
|
|
public static class RendererMixin |
|
|
|
{ |
|
|
|
static int s_frameNum; |
|
|
|
static int s_fps; |
|
|
|
static int s_currentFrames; |
|
|
|
static TimeSpan s_lastMeasure; |
|
|
|
static Stopwatch s_stopwatch = Stopwatch.StartNew(); |
|
|
|
/// <summary>
|
|
|
|
/// Renders the specified visual.
|
|
|
|
/// </summary>
|
|
|
|
@ -28,10 +34,35 @@ namespace Perspex.Rendering |
|
|
|
public static void Render(this IRenderTarget renderTarget, IVisual visual) |
|
|
|
{ |
|
|
|
using (var ctx = renderTarget.CreateDrawingContext()) |
|
|
|
{ |
|
|
|
ctx.Render(visual); |
|
|
|
s_frameNum++; |
|
|
|
if (DrawFpsCounter) |
|
|
|
{ |
|
|
|
s_currentFrames++; |
|
|
|
var now = s_stopwatch.Elapsed; |
|
|
|
var elapsed = now - s_lastMeasure; |
|
|
|
if (elapsed.TotalSeconds > 0) |
|
|
|
{ |
|
|
|
s_fps = (int) (s_currentFrames/elapsed.TotalSeconds); |
|
|
|
s_currentFrames = 0; |
|
|
|
s_lastMeasure = now; |
|
|
|
} |
|
|
|
var pt = new Point(40, 40); |
|
|
|
using ( |
|
|
|
var txt = new FormattedText("Frame #" + s_frameNum + " FPS: " + s_fps, "Arial", 18, |
|
|
|
FontStyle.Normal, |
|
|
|
TextAlignment.Left, |
|
|
|
FontWeight.Normal)) |
|
|
|
{ |
|
|
|
ctx.FillRectangle(Brushes.White, new Rect(pt, txt.Measure())); |
|
|
|
ctx.DrawText(Brushes.Black, pt, txt); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static bool DrawFpsCounter { get; set; } |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Renders the specified visual.
|
|
|
|
|