Browse Source

Notify tick count in IRenderTimer.Tick.

pull/1715/head
Steven Kirk 8 years ago
committed by Jeremy Koritzinsky
parent
commit
8ec2c8f661
  1. 4
      src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs
  2. 12
      src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs
  3. 2
      src/Avalonia.Visuals/Rendering/IRenderTimer.cs
  4. 2
      src/Avalonia.Visuals/Rendering/RenderLoop.cs
  5. 4
      src/OSX/Avalonia.MonoMac/RenderTimer.cs
  6. 3
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  7. 8
      src/Windows/Avalonia.Win32/RenderTimer.cs

4
src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs

@ -14,7 +14,7 @@ namespace Avalonia.Controls.Platform
public InternalPlatformThreadingInterface() public InternalPlatformThreadingInterface()
{ {
TlsCurrentThreadIsLoopThread = true; 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); private readonly AutoResetEvent _signaled = new AutoResetEvent(false);
@ -105,7 +105,7 @@ namespace Avalonia.Controls.Platform
public bool CurrentThreadIsLoopThread => TlsCurrentThreadIsLoopThread; public bool CurrentThreadIsLoopThread => TlsCurrentThreadIsLoopThread;
public event Action<DispatcherPriority?> Signaled; public event Action<DispatcherPriority?> Signaled;
public event EventHandler<EventArgs> Tick; public event Action<long> Tick;
} }
} }

12
src/Avalonia.Visuals/Rendering/DefaultRenderTimer.cs

@ -18,7 +18,7 @@ namespace Avalonia.Rendering
{ {
private IRuntimePlatform _runtime; private IRuntimePlatform _runtime;
private int _subscriberCount; private int _subscriberCount;
private EventHandler<EventArgs> _tick; private Action<long> _tick;
private IDisposable _subscription; private IDisposable _subscription;
/// <summary> /// <summary>
@ -38,7 +38,7 @@ namespace Avalonia.Rendering
public int FramesPerSecond { get; } public int FramesPerSecond { get; }
/// <inheritdoc/> /// <inheritdoc/>
public event EventHandler<EventArgs> Tick public event Action<long> Tick
{ {
add add
{ {
@ -77,14 +77,14 @@ namespace Avalonia.Rendering
/// This can be overridden by platform implementations to use a specialized timer /// This can be overridden by platform implementations to use a specialized timer
/// implementation. /// implementation.
/// </remarks> /// </remarks>
protected virtual IDisposable StartCore(Action tick) protected virtual IDisposable StartCore(Action<long> tick)
{ {
if (_runtime == null) if (_runtime == null)
{ {
_runtime = AvaloniaLocator.Current.GetService<IRuntimePlatform>(); _runtime = AvaloniaLocator.Current.GetService<IRuntimePlatform>();
} }
return _runtime.StartSystemTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), tick); return _runtime.StartSystemTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), () => tick(Environment.TickCount));
} }
/// <summary> /// <summary>
@ -96,9 +96,9 @@ namespace Avalonia.Rendering
_subscription = null; _subscription = null;
} }
private void InternalTick() private void InternalTick(long tickCount)
{ {
_tick(this, EventArgs.Empty); _tick(tickCount);
} }
} }
} }

2
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 /// This event can be raised on any thread; it is the responsibility of the subscriber to
/// switch execution to the right thread. /// switch execution to the right thread.
/// </remarks> /// </remarks>
event EventHandler<EventArgs> Tick; event Action<long> Tick;
} }
} }

2
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) if (!inTick)
{ {

4
src/OSX/Avalonia.MonoMac/RenderTimer.cs

@ -20,12 +20,12 @@ namespace Avalonia.MonoMac
{ {
using (new NSAutoreleasePool()) using (new NSAutoreleasePool())
{ {
Tick?.Invoke(this, EventArgs.Empty); Tick?.Invoke(Environment.TickCount);
} }
} }
}); });
} }
public event EventHandler<EventArgs> Tick; public event Action<long> Tick;
} }
} }

3
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -972,6 +972,9 @@ namespace Avalonia.Win32.Interop
[return: MarshalAs(UnmanagedType.Bool)] [return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetMonitorInfo([In] IntPtr hMonitor, [Out] MONITORINFO lpmi); 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)] [return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "PostMessageW")] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "PostMessageW")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

8
src/Windows/Avalonia.Win32/RenderTimer.cs

@ -14,9 +14,13 @@ namespace Avalonia.Win32
{ {
} }
protected override IDisposable StartCore(Action tick) protected override IDisposable StartCore(Action<long> 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( var handle = UnmanagedMethods.timeSetEvent(
(uint)(1000 / FramesPerSecond), (uint)(1000 / FramesPerSecond),

Loading…
Cancel
Save