Browse Source

Added FPS counter to test app.

pull/16/head
Steven Kirk 12 years ago
parent
commit
9afc768449
  1. 11
      Cairo/Perspex.Cairo/Renderer.cs
  2. 6
      Perspex.Controls.UnitTests/ControlTests.cs
  3. 6
      Perspex.Controls.UnitTests/TestRoot.cs
  4. 20
      Perspex.Controls/Window.cs
  5. 8
      Perspex.SceneGraph.UnitTests/TestRoot.cs
  6. 5
      Perspex.SceneGraph/Platform/IRenderer.cs
  7. 4
      Perspex.SceneGraph/Rendering/IRenderRoot.cs
  8. 39
      TestApplication/Program.cs
  9. 11
      Windows/Perspex.Direct2D1/Renderer.cs

11
Cairo/Perspex.Cairo/Renderer.cs

@ -28,6 +28,15 @@ namespace Perspex.Cairo
{ {
} }
/// <summary>
/// Gets the number of times <see cref="Render"/> has been called.
/// </summary>
public int RenderCount
{
get;
private set;
}
/// <summary> /// <summary>
/// Renders the specified visual. /// Renders the specified visual.
/// </summary> /// </summary>
@ -39,6 +48,8 @@ namespace Perspex.Cairo
{ {
this.Render(visual, context); this.Render(visual, context);
} }
++this.RenderCount;
} }
/// <summary> /// <summary>

6
Perspex.Controls.UnitTests/ControlTests.cs

@ -12,6 +12,7 @@ namespace Perspex.Controls.UnitTests
using Moq; using Moq;
using Perspex.Controls; using Perspex.Controls;
using Perspex.Layout; using Perspex.Layout;
using Perspex.Platform;
using Perspex.Rendering; using Perspex.Rendering;
using Perspex.Styling; using Perspex.Styling;
using Splat; using Splat;
@ -82,6 +83,11 @@ namespace Perspex.Controls.UnitTests
get { throw new System.NotImplementedException(); } get { throw new System.NotImplementedException(); }
} }
public IRenderer Renderer
{
get { throw new NotImplementedException(); }
}
public IRenderManager RenderManager public IRenderManager RenderManager
{ {
get { throw new NotImplementedException(); } get { throw new NotImplementedException(); }

6
Perspex.Controls.UnitTests/TestRoot.cs

@ -9,6 +9,7 @@ namespace Perspex.Controls.UnitTests
using System; using System;
using Moq; using Moq;
using Perspex.Layout; using Perspex.Layout;
using Perspex.Platform;
using Perspex.Rendering; using Perspex.Rendering;
internal class TestRoot : Decorator, ILayoutRoot, IRenderRoot internal class TestRoot : Decorator, ILayoutRoot, IRenderRoot
@ -23,6 +24,11 @@ namespace Perspex.Controls.UnitTests
get { return new Mock<ILayoutManager>().Object; } get { return new Mock<ILayoutManager>().Object; }
} }
public IRenderer Renderer
{
get { throw new NotImplementedException(); }
}
public IRenderManager RenderManager public IRenderManager RenderManager
{ {
get { throw new NotImplementedException(); } get { throw new NotImplementedException(); }

20
Perspex.Controls/Window.cs

@ -30,6 +30,8 @@ namespace Perspex.Controls
private Dispatcher dispatcher; private Dispatcher dispatcher;
private IRenderManager renderManager;
private IRenderer renderer; private IRenderer renderer;
private IInputManager inputManager; private IInputManager inputManager;
@ -47,7 +49,7 @@ namespace Perspex.Controls
this.impl = Locator.Current.GetService<IWindowImpl>(); this.impl = Locator.Current.GetService<IWindowImpl>();
this.inputManager = Locator.Current.GetService<IInputManager>(); this.inputManager = Locator.Current.GetService<IInputManager>();
this.LayoutManager = Locator.Current.GetService<ILayoutManager>(); this.LayoutManager = Locator.Current.GetService<ILayoutManager>();
this.RenderManager = Locator.Current.GetService<IRenderManager>(); this.renderManager = Locator.Current.GetService<IRenderManager>();
if (renderInterface == null) if (renderInterface == null)
{ {
@ -73,7 +75,7 @@ namespace Perspex.Controls
"Could not create layout manager: maybe Application.RegisterServices() wasn't called?"); "Could not create layout manager: maybe Application.RegisterServices() wasn't called?");
} }
if (this.RenderManager == null) if (this.renderManager == null)
{ {
throw new InvalidOperationException( throw new InvalidOperationException(
"Could not create render manager: maybe Application.RegisterServices() wasn't called?"); "Could not create render manager: maybe Application.RegisterServices() wasn't called?");
@ -92,7 +94,7 @@ namespace Perspex.Controls
this.LayoutManager.Root = this; this.LayoutManager.Root = this;
this.LayoutManager.LayoutNeeded.Subscribe(_ => this.HandleLayoutNeeded()); 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)); this.GetObservable(TitleProperty).Subscribe(s => this.impl.SetTitle(s));
@ -122,10 +124,14 @@ namespace Perspex.Controls
private set; private set;
} }
public IRenderManager RenderManager IRenderer IRenderRoot.Renderer
{ {
get; get { return this.renderer; }
private set; }
IRenderManager IRenderRoot.RenderManager
{
get { return this.renderManager; }
} }
public void Show() public void Show()
@ -172,7 +178,7 @@ namespace Perspex.Controls
private void HandlePaint(Rect rect, IPlatformHandle handle) private void HandlePaint(Rect rect, IPlatformHandle handle)
{ {
this.renderer.Render(this, handle); this.renderer.Render(this, handle);
this.RenderManager.RenderFinished(); this.renderManager.RenderFinished();
} }
private void HandleResized(Size size) private void HandleResized(Size size)

8
Perspex.SceneGraph.UnitTests/TestRoot.cs

@ -6,12 +6,16 @@
namespace Perspex.SceneGraph.UnitTests namespace Perspex.SceneGraph.UnitTests
{ {
using System; using System;
using System.Collections.Generic; using Perspex.Platform;
using System.Linq;
using Perspex.Rendering; using Perspex.Rendering;
public class TestRoot : TestVisual, IRenderRoot public class TestRoot : TestVisual, IRenderRoot
{ {
public IRenderer Renderer
{
get { throw new NotImplementedException(); }
}
public IRenderManager RenderManager public IRenderManager RenderManager
{ {
get { throw new NotImplementedException(); } get { throw new NotImplementedException(); }

5
Perspex.SceneGraph/Platform/IRenderer.cs

@ -10,6 +10,11 @@ namespace Perspex.Platform
public interface IRenderer public interface IRenderer
{ {
/// <summary>
/// Gets the number of times <see cref="Render"/> has been called.
/// </summary>
int RenderCount { get; }
/// <summary> /// <summary>
/// Renders the specified visual. /// Renders the specified visual.
/// </summary> /// </summary>

4
Perspex.SceneGraph/Rendering/IRenderRoot.cs

@ -6,8 +6,12 @@
namespace Perspex.Rendering namespace Perspex.Rendering
{ {
using Perspex.Platform;
public interface IRenderRoot public interface IRenderRoot
{ {
IRenderer Renderer { get; }
IRenderManager RenderManager { get; } IRenderManager RenderManager { get; }
} }
} }

39
TestApplication/Program.cs

@ -9,6 +9,7 @@ using Perspex.Diagnostics;
using Perspex.Layout; using Perspex.Layout;
using Perspex.Media; using Perspex.Media;
using Perspex.Media.Imaging; using Perspex.Media.Imaging;
using Perspex.Rendering;
using Perspex.Styling; using Perspex.Styling;
using Perspex.Threading; using Perspex.Threading;
#if PERSPEX_GTK #if PERSPEX_GTK
@ -115,11 +116,18 @@ namespace TestApplication
}, },
}; };
TextBlock fps;
Window window = new Window Window window = new Window
{ {
Title = "Perspex Test Application", Title = "Perspex Test Application",
Content = new Grid Content = new Grid
{ {
ColumnDefinitions = new ColumnDefinitions
{
new ColumnDefinition(1, GridUnitType.Star),
new ColumnDefinition(1, GridUnitType.Star),
},
RowDefinitions = new RowDefinitions RowDefinitions = new RowDefinitions
{ {
new RowDefinition(1, GridUnitType.Star), new RowDefinition(1, GridUnitType.Star),
@ -138,21 +146,38 @@ namespace TestApplication
SlidersTab(), SlidersTab(),
LayoutTab(), LayoutTab(),
AnimationsTab(), AnimationsTab(),
} },
[Grid.ColumnSpanProperty] = 2,
}, },
(fps = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Left,
Margin = new Thickness(2),
[Grid.RowProperty] = 1,
}),
new TextBlock new TextBlock
{ {
Text = "Press F12 for Dev Tools", Text = "Press F12 for Dev Tools",
HorizontalAlignment = HorizontalAlignment.Right, HorizontalAlignment = HorizontalAlignment.Right,
Margin = new Thickness(2), Margin = new Thickness(2),
[Grid.ColumnProperty] = 1,
[Grid.RowProperty] = 1, [Grid.RowProperty] = 1,
} },
} }
}, },
}; };
DevTools.Attach(window); 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(); window.Show();
Application.Current.Run(window); Application.Current.Run(window);
} }
@ -508,11 +533,11 @@ namespace TestApplication
}; };
Animate.Property( Animate.Property(
(PerspexObject)rect1.RenderTransform, (PerspexObject)rect1.RenderTransform,
RotateTransform.AngleProperty, RotateTransform.AngleProperty,
0.0, 0.0,
360.0, 360.0,
new LinearDoubleEasing(), new LinearDoubleEasing(),
TimeSpan.FromSeconds(4), TimeSpan.FromSeconds(4),
double.PositiveInfinity); double.PositiveInfinity);

11
Windows/Perspex.Direct2D1/Renderer.cs

@ -81,6 +81,15 @@ namespace Perspex.Direct2D1
private set; private set;
} }
/// <summary>
/// Gets the number of times <see cref="Render"/> has been called.
/// </summary>
public int RenderCount
{
get;
private set;
}
/// <summary> /// <summary>
/// Renders the specified visual. /// Renders the specified visual.
/// </summary> /// </summary>
@ -92,6 +101,8 @@ namespace Perspex.Direct2D1
{ {
this.Render(visual, context); this.Render(visual, context);
} }
++this.RenderCount;
} }
/// <summary> /// <summary>

Loading…
Cancel
Save