diff --git a/Cairo/Perspex.Cairo/Renderer.cs b/Cairo/Perspex.Cairo/Renderer.cs
index 79e34dad06..ec8d105010 100644
--- a/Cairo/Perspex.Cairo/Renderer.cs
+++ b/Cairo/Perspex.Cairo/Renderer.cs
@@ -28,6 +28,15 @@ namespace Perspex.Cairo
{
}
+ ///
+ /// Gets the number of times has been called.
+ ///
+ public int RenderCount
+ {
+ get;
+ private set;
+ }
+
///
/// Renders the specified visual.
///
@@ -39,6 +48,8 @@ namespace Perspex.Cairo
{
this.Render(visual, context);
}
+
+ ++this.RenderCount;
}
///
diff --git a/Perspex.Controls.UnitTests/ControlTests.cs b/Perspex.Controls.UnitTests/ControlTests.cs
index e4b30be752..8262033309 100644
--- a/Perspex.Controls.UnitTests/ControlTests.cs
+++ b/Perspex.Controls.UnitTests/ControlTests.cs
@@ -12,6 +12,7 @@ namespace Perspex.Controls.UnitTests
using Moq;
using Perspex.Controls;
using Perspex.Layout;
+ using Perspex.Platform;
using Perspex.Rendering;
using Perspex.Styling;
using Splat;
@@ -82,6 +83,11 @@ namespace Perspex.Controls.UnitTests
get { throw new System.NotImplementedException(); }
}
+ public IRenderer Renderer
+ {
+ get { throw new NotImplementedException(); }
+ }
+
public IRenderManager RenderManager
{
get { throw new NotImplementedException(); }
diff --git a/Perspex.Controls.UnitTests/TestRoot.cs b/Perspex.Controls.UnitTests/TestRoot.cs
index 0f69583d5a..7859213b08 100644
--- a/Perspex.Controls.UnitTests/TestRoot.cs
+++ b/Perspex.Controls.UnitTests/TestRoot.cs
@@ -9,6 +9,7 @@ namespace Perspex.Controls.UnitTests
using System;
using Moq;
using Perspex.Layout;
+ using Perspex.Platform;
using Perspex.Rendering;
internal class TestRoot : Decorator, ILayoutRoot, IRenderRoot
@@ -23,6 +24,11 @@ namespace Perspex.Controls.UnitTests
get { return new Mock().Object; }
}
+ public IRenderer Renderer
+ {
+ get { throw new NotImplementedException(); }
+ }
+
public IRenderManager RenderManager
{
get { throw new NotImplementedException(); }
diff --git a/Perspex.Controls/Window.cs b/Perspex.Controls/Window.cs
index 0f6494fc82..f2838b329e 100644
--- a/Perspex.Controls/Window.cs
+++ b/Perspex.Controls/Window.cs
@@ -30,6 +30,8 @@ namespace Perspex.Controls
private Dispatcher dispatcher;
+ private IRenderManager renderManager;
+
private IRenderer renderer;
private IInputManager inputManager;
@@ -47,7 +49,7 @@ namespace Perspex.Controls
this.impl = Locator.Current.GetService();
this.inputManager = Locator.Current.GetService();
this.LayoutManager = Locator.Current.GetService();
- this.RenderManager = Locator.Current.GetService();
+ this.renderManager = Locator.Current.GetService();
if (renderInterface == null)
{
@@ -73,7 +75,7 @@ namespace Perspex.Controls
"Could not create layout manager: maybe Application.RegisterServices() wasn't called?");
}
- if (this.RenderManager == null)
+ if (this.renderManager == null)
{
throw new InvalidOperationException(
"Could not create render manager: maybe Application.RegisterServices() wasn't called?");
@@ -92,7 +94,7 @@ namespace Perspex.Controls
this.LayoutManager.Root = this;
this.LayoutManager.LayoutNeeded.Subscribe(_ => this.HandleLayoutNeeded());
- this.RenderManager.RenderNeeded.Subscribe(_ => this.HandleRenderNeeded());
+ this.renderManager.RenderNeeded.Subscribe(_ => this.HandleRenderNeeded());
this.GetObservable(TitleProperty).Subscribe(s => this.impl.SetTitle(s));
@@ -122,10 +124,14 @@ namespace Perspex.Controls
private set;
}
- public IRenderManager RenderManager
+ IRenderer IRenderRoot.Renderer
{
- get;
- private set;
+ get { return this.renderer; }
+ }
+
+ IRenderManager IRenderRoot.RenderManager
+ {
+ get { return this.renderManager; }
}
public void Show()
@@ -172,7 +178,7 @@ namespace Perspex.Controls
private void HandlePaint(Rect rect, IPlatformHandle handle)
{
this.renderer.Render(this, handle);
- this.RenderManager.RenderFinished();
+ this.renderManager.RenderFinished();
}
private void HandleResized(Size size)
diff --git a/Perspex.SceneGraph.UnitTests/TestRoot.cs b/Perspex.SceneGraph.UnitTests/TestRoot.cs
index 03fbf4d7b6..6bae5c7352 100644
--- a/Perspex.SceneGraph.UnitTests/TestRoot.cs
+++ b/Perspex.SceneGraph.UnitTests/TestRoot.cs
@@ -6,12 +6,16 @@
namespace Perspex.SceneGraph.UnitTests
{
using System;
- using System.Collections.Generic;
- using System.Linq;
+ using Perspex.Platform;
using Perspex.Rendering;
public class TestRoot : TestVisual, IRenderRoot
{
+ public IRenderer Renderer
+ {
+ get { throw new NotImplementedException(); }
+ }
+
public IRenderManager RenderManager
{
get { throw new NotImplementedException(); }
diff --git a/Perspex.SceneGraph/Platform/IRenderer.cs b/Perspex.SceneGraph/Platform/IRenderer.cs
index 0d7dc136e2..1724e5f51d 100644
--- a/Perspex.SceneGraph/Platform/IRenderer.cs
+++ b/Perspex.SceneGraph/Platform/IRenderer.cs
@@ -10,6 +10,11 @@ namespace Perspex.Platform
public interface IRenderer
{
+ ///
+ /// Gets the number of times has been called.
+ ///
+ int RenderCount { get; }
+
///
/// Renders the specified visual.
///
diff --git a/Perspex.SceneGraph/Rendering/IRenderRoot.cs b/Perspex.SceneGraph/Rendering/IRenderRoot.cs
index 647b3afc1c..9edd3afa34 100644
--- a/Perspex.SceneGraph/Rendering/IRenderRoot.cs
+++ b/Perspex.SceneGraph/Rendering/IRenderRoot.cs
@@ -6,8 +6,12 @@
namespace Perspex.Rendering
{
+ using Perspex.Platform;
+
public interface IRenderRoot
{
+ IRenderer Renderer { get; }
+
IRenderManager RenderManager { get; }
}
}
diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs
index 1561fa5edd..393ce2b4da 100644
--- a/TestApplication/Program.cs
+++ b/TestApplication/Program.cs
@@ -9,6 +9,7 @@ using Perspex.Diagnostics;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Media.Imaging;
+using Perspex.Rendering;
using Perspex.Styling;
using Perspex.Threading;
#if PERSPEX_GTK
@@ -115,11 +116,18 @@ namespace TestApplication
},
};
+ TextBlock fps;
+
Window window = new Window
{
Title = "Perspex Test Application",
Content = new Grid
{
+ ColumnDefinitions = new ColumnDefinitions
+ {
+ new ColumnDefinition(1, GridUnitType.Star),
+ new ColumnDefinition(1, GridUnitType.Star),
+ },
RowDefinitions = new RowDefinitions
{
new RowDefinition(1, GridUnitType.Star),
@@ -138,21 +146,38 @@ namespace TestApplication
SlidersTab(),
LayoutTab(),
AnimationsTab(),
- }
+ },
+ [Grid.ColumnSpanProperty] = 2,
},
+ (fps = new TextBlock
+ {
+ HorizontalAlignment = HorizontalAlignment.Left,
+ Margin = new Thickness(2),
+ [Grid.RowProperty] = 1,
+ }),
new TextBlock
{
Text = "Press F12 for Dev Tools",
HorizontalAlignment = HorizontalAlignment.Right,
Margin = new Thickness(2),
+ [Grid.ColumnProperty] = 1,
[Grid.RowProperty] = 1,
- }
+ },
}
},
};
DevTools.Attach(window);
+ var renderer = ((IRenderRoot)window).Renderer;
+ var last = renderer.RenderCount;
+ DispatcherTimer.Run(() =>
+ {
+ fps.Text = "FPS: " + (renderer.RenderCount - last);
+ last = renderer.RenderCount;
+ return true;
+ }, TimeSpan.FromSeconds(1));
+
window.Show();
Application.Current.Run(window);
}
@@ -508,11 +533,11 @@ namespace TestApplication
};
Animate.Property(
- (PerspexObject)rect1.RenderTransform,
- RotateTransform.AngleProperty,
- 0.0,
- 360.0,
- new LinearDoubleEasing(),
+ (PerspexObject)rect1.RenderTransform,
+ RotateTransform.AngleProperty,
+ 0.0,
+ 360.0,
+ new LinearDoubleEasing(),
TimeSpan.FromSeconds(4),
double.PositiveInfinity);
diff --git a/Windows/Perspex.Direct2D1/Renderer.cs b/Windows/Perspex.Direct2D1/Renderer.cs
index fc6e5bbce8..efc44421a8 100644
--- a/Windows/Perspex.Direct2D1/Renderer.cs
+++ b/Windows/Perspex.Direct2D1/Renderer.cs
@@ -81,6 +81,15 @@ namespace Perspex.Direct2D1
private set;
}
+ ///
+ /// Gets the number of times has been called.
+ ///
+ public int RenderCount
+ {
+ get;
+ private set;
+ }
+
///
/// Renders the specified visual.
///
@@ -92,6 +101,8 @@ namespace Perspex.Direct2D1
{
this.Render(visual, context);
}
+
+ ++this.RenderCount;
}
///