Browse Source

Prevent reentrancy in renderer.

scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
d9d5e8b6ac
  1. 10
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

10
src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

@ -20,6 +20,7 @@ namespace Avalonia.Rendering
private ConcurrentQueue<Rect> _renderQueue = new ConcurrentQueue<Rect>();
private bool _needsUpdate;
private bool _updateQueued;
private bool _rendering;
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
private int _totalFrames;
@ -169,12 +170,19 @@ namespace Avalonia.Rendering
private void OnRenderLoopTick(object sender, EventArgs e)
{
if (_rendering)
{
return;
}
if (_needsUpdate && !_updateQueued)
{
Dispatcher.UIThread.InvokeAsync(UpdateScene, DispatcherPriority.Render);
_updateQueued = true;
}
_rendering = true;
if (!_renderQueue.IsEmpty)
{
if (_renderTarget == null)
@ -210,6 +218,8 @@ namespace Avalonia.Rendering
_renderTarget = null;
}
}
_rendering = false;
}
}
}

Loading…
Cancel
Save