From 8ec2c8f661839f7826e2e262431c0b7debe4ad0e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 28 Jun 2018 10:36:35 +0200 Subject: [PATCH] Notify tick count in IRenderTimer.Tick. --- .../Platform/InternalPlatformThreadingInterface.cs | 4 ++-- src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs | 12 ++++++------ src/Avalonia.Visuals/Rendering/IRenderTimer.cs | 2 +- src/Avalonia.Visuals/Rendering/RenderLoop.cs | 2 +- src/OSX/Avalonia.MonoMac/RenderTimer.cs | 4 ++-- .../Avalonia.Win32/Interop/UnmanagedMethods.cs | 3 +++ src/Windows/Avalonia.Win32/RenderTimer.cs | 8 ++++++-- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs b/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs index 47e600b9c8..501e15653a 100644 --- a/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs +++ b/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs @@ -14,7 +14,7 @@ namespace Avalonia.Controls.Platform public InternalPlatformThreadingInterface() { TlsCurrentThreadIsLoopThread = true; - StartTimer(DispatcherPriority.Render, new TimeSpan(0, 0, 0, 0, 66), () => Tick?.Invoke(this, new EventArgs())); + StartTimer(DispatcherPriority.Render, new TimeSpan(0, 0, 0, 0, 66), () => Tick?.Invoke(Environment.TickCount)); } private readonly AutoResetEvent _signaled = new AutoResetEvent(false); @@ -105,7 +105,7 @@ namespace Avalonia.Controls.Platform public bool CurrentThreadIsLoopThread => TlsCurrentThreadIsLoopThread; public event Action Signaled; - public event EventHandler Tick; + public event Action Tick; } } \ No newline at end of file diff --git a/src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs b/src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs index 7ad8915bc4..6b16ff8038 100644 --- a/src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs +++ b/src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs @@ -18,7 +18,7 @@ namespace Avalonia.Rendering { private IRuntimePlatform _runtime; private int _subscriberCount; - private EventHandler _tick; + private Action _tick; private IDisposable _subscription; /// @@ -38,7 +38,7 @@ namespace Avalonia.Rendering public int FramesPerSecond { get; } /// - public event EventHandler Tick + public event Action Tick { add { @@ -77,14 +77,14 @@ namespace Avalonia.Rendering /// This can be overridden by platform implementations to use a specialized timer /// implementation. /// - protected virtual IDisposable StartCore(Action tick) + protected virtual IDisposable StartCore(Action tick) { if (_runtime == null) { _runtime = AvaloniaLocator.Current.GetService(); } - return _runtime.StartSystemTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), tick); + return _runtime.StartSystemTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), () => tick(Environment.TickCount)); } /// @@ -96,9 +96,9 @@ namespace Avalonia.Rendering _subscription = null; } - private void InternalTick() + private void InternalTick(long tickCount) { - _tick(this, EventArgs.Empty); + _tick(tickCount); } } } diff --git a/src/Avalonia.Visuals/Rendering/IRenderTimer.cs b/src/Avalonia.Visuals/Rendering/IRenderTimer.cs index 2665d6dd0b..78f6183994 100644 --- a/src/Avalonia.Visuals/Rendering/IRenderTimer.cs +++ b/src/Avalonia.Visuals/Rendering/IRenderTimer.cs @@ -15,6 +15,6 @@ namespace Avalonia.Rendering /// This event can be raised on any thread; it is the responsibility of the subscriber to /// switch execution to the right thread. /// - event EventHandler Tick; + event Action Tick; } } \ No newline at end of file diff --git a/src/Avalonia.Visuals/Rendering/RenderLoop.cs b/src/Avalonia.Visuals/Rendering/RenderLoop.cs index 25febf8187..bdcfdcba8e 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLoop.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLoop.cs @@ -62,7 +62,7 @@ namespace Avalonia.Rendering } } - private async void TimerTick(object sender, EventArgs e) + private async void TimerTick(long tickCount) { if (!inTick) { diff --git a/src/OSX/Avalonia.MonoMac/RenderTimer.cs b/src/OSX/Avalonia.MonoMac/RenderTimer.cs index d2fd50484a..71f657b690 100644 --- a/src/OSX/Avalonia.MonoMac/RenderTimer.cs +++ b/src/OSX/Avalonia.MonoMac/RenderTimer.cs @@ -20,12 +20,12 @@ namespace Avalonia.MonoMac { using (new NSAutoreleasePool()) { - Tick?.Invoke(this, EventArgs.Empty); + Tick?.Invoke(Environment.TickCount); } } }); } - public event EventHandler Tick; + public event Action Tick; } } diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index f89086ccb7..1c70b3f03d 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -972,6 +972,9 @@ namespace Avalonia.Win32.Interop [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetMonitorInfo([In] IntPtr hMonitor, [Out] MONITORINFO lpmi); + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool QueryPerformanceCounter(out long lpPerformanceCount); + [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "PostMessageW")] public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); diff --git a/src/Windows/Avalonia.Win32/RenderTimer.cs b/src/Windows/Avalonia.Win32/RenderTimer.cs index 321a745fae..cea1bf94a5 100644 --- a/src/Windows/Avalonia.Win32/RenderTimer.cs +++ b/src/Windows/Avalonia.Win32/RenderTimer.cs @@ -14,9 +14,13 @@ namespace Avalonia.Win32 { } - protected override IDisposable StartCore(Action tick) + protected override IDisposable StartCore(Action tick) { - timerDelegate = (id, uMsg, user, dw1, dw2) => tick(); + timerDelegate = (id, uMsg, user, dw1, dw2) => + { + UnmanagedMethods.QueryPerformanceCounter(out long tickCount); + tick(tickCount); + }; var handle = UnmanagedMethods.timeSetEvent( (uint)(1000 / FramesPerSecond),