Browse Source

Merge 7483a08d6a into 658afb8717

pull/20969/merge
Javier Suárez 16 hours ago
committed by GitHub
parent
commit
76355a810e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 23
      src/iOS/Avalonia.iOS/DispatcherImpl.cs
  2. 4
      src/iOS/Avalonia.iOS/InputHandler.cs
  3. 3
      src/iOS/Avalonia.iOS/TextInputResponder.cs
  4. 42
      tests/Avalonia.Benchmarks/Rendering/iOSRenderingBenchmarks.cs

23
src/iOS/Avalonia.iOS/DispatcherImpl.cs

@ -22,7 +22,8 @@ internal class DispatcherImpl : IDispatcherImplWithExplicitBackgroundProcessing
private readonly IntPtr _mainLoop;
private readonly IntPtr _mainQueue;
private Thread? _loopThread;
private bool _backgroundProcessingRequested, _signaled;
private bool _backgroundProcessingRequested;
private int _signaled;
private unsafe DispatcherImpl()
{
@ -60,15 +61,12 @@ internal class DispatcherImpl : IDispatcherImplWithExplicitBackgroundProcessing
public unsafe void Signal()
{
lock (_sync)
if (Interlocked.CompareExchange(ref _signaled, 1, 0) != 0)
{
if (_signaled)
return;
_signaled = true;
Interop.dispatch_async_f(_mainQueue, IntPtr.Zero, &CheckSignaled);
Interop.CFRunLoopWakeUp(_mainLoop);
return;
}
Interop.dispatch_async_f(_mainQueue, IntPtr.Zero, &CheckSignaled);
Interop.CFRunLoopWakeUp(_mainLoop);
}
public void UpdateTimer(long? dueTimeInMs)
@ -91,14 +89,7 @@ internal class DispatcherImpl : IDispatcherImplWithExplicitBackgroundProcessing
private void CheckSignaled()
{
bool signaled;
lock (_sync)
{
signaled = _signaled;
_signaled = false;
}
if (signaled)
if (Interlocked.Exchange(ref _signaled, 0) != 0)
{
Signaled?.Invoke();
}

4
src/iOS/Avalonia.iOS/InputHandler.cs

@ -308,7 +308,7 @@ internal sealed class InputHandler
_tl.Input?.Invoke(new RawMouseWheelEventArgs(
_mouseDevice,
(ulong)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()),
(ulong)Environment.TickCount64,
Root,
_cachedScrollLocation ?? new Point(0, 0),
new Vector(deltaX, deltaY),
@ -372,7 +372,7 @@ internal sealed class InputHandler
// until the inertia stops.
_tl.Input?.Invoke(new RawMouseWheelEventArgs(
_mouseDevice,
(ulong)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()),
(ulong)Environment.TickCount64,
Root,
_cachedScrollLocation.Value,
new Vector(_momentumVelocityX, _momentumVelocityY),

3
src/iOS/Avalonia.iOS/TextInputResponder.cs

@ -84,6 +84,7 @@ partial class AvaloniaView
private int _inSurroundingTextUpdateEvent;
private readonly UITextPosition _beginningOfDocument = new AvaloniaTextPosition(0);
private readonly UITextInputStringTokenizer _tokenizer;
private readonly NSString _textInputContextIdentifier = new NSString(Guid.NewGuid().ToString());
private bool _isInUpdate;
public TextInputMethodClient? Client => _client;
@ -95,7 +96,7 @@ partial class AvaloniaView
public override UIEditingInteractionConfiguration EditingInteractionConfiguration =>
UIEditingInteractionConfiguration.Default;
public override NSString TextInputContextIdentifier => new NSString(Guid.NewGuid().ToString());
public override NSString TextInputContextIdentifier => _textInputContextIdentifier;
public override UITextInputMode TextInputMode
{

42
tests/Avalonia.Benchmarks/Rendering/iOSRenderingBenchmarks.cs

@ -0,0 +1,42 @@
#nullable enable
using System;
using BenchmarkDotNet.Attributes;
namespace Avalonia.Benchmarks.Rendering
{
/// <summary>
/// Benchmarks for Avalonia.iOS hot path patterns.
/// Run with: dotnet run -c Release -- --filter *iOSRenderingBenchmarks*
/// </summary>
[MemoryDiagnoser]
public class iOSRenderingBenchmarks
{
private const int FrameCount = 1000;
// iOS TextInputContextIdentifier: new Guid+string+wrapper vs cached (TextInputResponder.cs)
[Benchmark]
public string? Current_TextInputContextId_NewGuidPerAccess()
{
string? last = null;
for (int i = 0; i < FrameCount; i++)
{
last = Guid.NewGuid().ToString();
}
return last;
}
[Benchmark]
public string? Optimized_TextInputContextId_Cached()
{
string cached = Guid.NewGuid().ToString();
string? last = null;
for (int i = 0; i < FrameCount; i++)
{
last = cached;
}
return last;
}
}
}
Loading…
Cancel
Save