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; } ///