Browse Source

Merge pull request #8658 from AvaloniaUI/fixes/invalidate-visual-backpressure

Add backpressure for sending batches to the render thread
pull/8680/head
Max Katz 4 years ago
committed by GitHub
parent
commit
b7af9c35a4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs
  2. 13
      src/Avalonia.Base/Rendering/Composition/Compositor.cs
  3. 3
      src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs

2
src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs

@ -71,7 +71,7 @@ public class CompositingRenderer : IRendererWithCompositor
if(_queuedUpdate)
return;
_queuedUpdate = true;
Dispatcher.UIThread.Post(_update, DispatcherPriority.Composition);
_compositor.InvokeWhenReadyForNextCommit(_update);
}
/// <inheritdoc/>

13
src/Avalonia.Base/Rendering/Composition/Compositor.cs

@ -33,6 +33,7 @@ namespace Avalonia.Rendering.Composition
internal IEasing DefaultEasing { get; }
private List<Action>? _invokeOnNextCommit;
private readonly Stack<List<Action>> _invokeListPool = new();
private Task? _lastBatchCompleted;
/// <summary>
/// Creates a new compositor on a specified render loop that would use a particular GPU
@ -86,7 +87,7 @@ namespace Avalonia.Rendering.Composition
if (_invokeOnNextCommit != null)
ScheduleCommitCallbacks(batch.Completed);
return batch.Completed;
return _lastBatchCompleted = batch.Completed;
}
async void ScheduleCommitCallbacks(Task task)
@ -139,5 +140,15 @@ namespace Avalonia.Rendering.Composition
_invokeOnNextCommit ??= _invokeListPool.Count > 0 ? _invokeListPool.Pop() : new();
_invokeOnNextCommit.Add(action);
}
public void InvokeWhenReadyForNextCommit(Action action)
{
if (_lastBatchCompleted == null || _lastBatchCompleted.IsCompleted)
Dispatcher.UIThread.Post(action, DispatcherPriority.Composition);
else
_lastBatchCompleted.ContinueWith(
static (_, state) => Dispatcher.UIThread.Post((Action)state!, DispatcherPriority.Composition),
action);
}
}
}

3
src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs

@ -108,6 +108,7 @@ namespace Avalonia.Rendering.Composition.Server
private void RenderCore()
{
ApplyPendingBatches();
CompletePendingBatches();
foreach(var animation in _activeAnimations)
_animationsToUpdate.Add(animation);
@ -119,8 +120,6 @@ namespace Avalonia.Rendering.Composition.Server
foreach (var t in _activeTargets)
t.Render();
CompletePendingBatches();
}
public void AddCompositionTarget(ServerCompositionTarget target)

Loading…
Cancel
Save