diff --git a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs
index db773bc43c..9aa3c25425 100644
--- a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs
+++ b/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);
}
///
diff --git a/src/Avalonia.Base/Rendering/Composition/Compositor.cs b/src/Avalonia.Base/Rendering/Composition/Compositor.cs
index 45212d0f36..10360f7874 100644
--- a/src/Avalonia.Base/Rendering/Composition/Compositor.cs
+++ b/src/Avalonia.Base/Rendering/Composition/Compositor.cs
@@ -33,6 +33,7 @@ namespace Avalonia.Rendering.Composition
internal IEasing DefaultEasing { get; }
private List? _invokeOnNextCommit;
private readonly Stack> _invokeListPool = new();
+ private Task? _lastBatchCompleted;
///
/// 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);
+ }
}
}
diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs
index 621bc84f4a..bfc2b2d626 100644
--- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs
+++ b/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)