|
|
|
@ -32,7 +32,6 @@ namespace Avalonia.Rendering |
|
|
|
private volatile IRef<Scene> _scene; |
|
|
|
private DirtyVisuals _dirty; |
|
|
|
private IRef<IRenderTargetBitmapImpl> _overlay; |
|
|
|
private bool _updateQueued; |
|
|
|
private object _rendering = new object(); |
|
|
|
private int _lastSceneId = -1; |
|
|
|
private DisplayDirtyRects _dirtyRectsDisplay = new DisplayDirtyRects(); |
|
|
|
@ -394,42 +393,34 @@ namespace Avalonia.Rendering |
|
|
|
private void UpdateScene() |
|
|
|
{ |
|
|
|
Dispatcher.UIThread.VerifyAccess(); |
|
|
|
|
|
|
|
try |
|
|
|
if (_root.IsVisible) |
|
|
|
{ |
|
|
|
if (_root.IsVisible) |
|
|
|
{ |
|
|
|
var sceneRef = RefCountable.Create(_scene?.Item.CloneScene() ?? new Scene(_root)); |
|
|
|
var scene = sceneRef.Item; |
|
|
|
var sceneRef = RefCountable.Create(_scene?.Item.CloneScene() ?? new Scene(_root)); |
|
|
|
var scene = sceneRef.Item; |
|
|
|
|
|
|
|
if (_dirty == null) |
|
|
|
{ |
|
|
|
_dirty = new DirtyVisuals(); |
|
|
|
_sceneBuilder.UpdateAll(scene); |
|
|
|
} |
|
|
|
else if (_dirty.Count > 0) |
|
|
|
if (_dirty == null) |
|
|
|
{ |
|
|
|
_dirty = new DirtyVisuals(); |
|
|
|
_sceneBuilder.UpdateAll(scene); |
|
|
|
} |
|
|
|
else if (_dirty.Count > 0) |
|
|
|
{ |
|
|
|
foreach (var visual in _dirty) |
|
|
|
{ |
|
|
|
foreach (var visual in _dirty) |
|
|
|
{ |
|
|
|
_sceneBuilder.Update(scene, visual); |
|
|
|
} |
|
|
|
_sceneBuilder.Update(scene, visual); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var oldScene = Interlocked.Exchange(ref _scene, sceneRef); |
|
|
|
oldScene?.Dispose(); |
|
|
|
var oldScene = Interlocked.Exchange(ref _scene, sceneRef); |
|
|
|
oldScene?.Dispose(); |
|
|
|
|
|
|
|
_dirty.Clear(); |
|
|
|
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size)); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var oldScene = Interlocked.Exchange(ref _scene, null); |
|
|
|
oldScene?.Dispose(); |
|
|
|
} |
|
|
|
_dirty.Clear(); |
|
|
|
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size)); |
|
|
|
} |
|
|
|
finally |
|
|
|
else |
|
|
|
{ |
|
|
|
_updateQueued = false; |
|
|
|
var oldScene = Interlocked.Exchange(ref _scene, null); |
|
|
|
oldScene?.Dispose(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|