@ -17,7 +17,7 @@ namespace Avalonia.Rendering
private Scene _ scene ;
private IRenderTarget _ renderTarget ;
private List < IVisual > _d irty = new List < IVisual > ( ) ;
private ConcurrentQueue < Rect > _ renderQueue = new ConcurrentQueue < Rect > ( ) ;
private DirtyRects _d irtyRects ;
private bool _ needsUpdate ;
private bool _ updateQueued ;
private bool _ rendering ;
@ -99,7 +99,7 @@ namespace Avalonia.Rendering
}
}
private void RenderFps ( IDrawingContextImpl context )
private void RenderFps ( IDrawingContextImpl context , int count )
{
var now = _ stopwatch . Elapsed ;
var elapsed = now - _l astFpsUpdate ;
@ -115,7 +115,7 @@ namespace Avalonia.Rendering
var pt = new Point ( 4 0 , 4 0 ) ;
using (
var txt = new FormattedText ( "Frame #" + _ totalFrames + " FPS: " + _f ps , "Arial" , 1 8 ,
var txt = new FormattedText ( $"Frame #{_totalFrames} FPS: {_fps} Updates: {count}" , "Arial" , 1 8 ,
FontStyle . Normal ,
TextAlignment . Left ,
FontWeight . Normal ,
@ -134,31 +134,30 @@ namespace Avalonia.Rendering
try
{
var scene = _ scene . Clone ( ) ;
var dirtyRects = new DirtyRects ( ) ;
if ( _d irty . Count > 0 )
{
var dirtyRects = new DirtyRects ( ) ;
foreach ( var visual in _d irty )
{
SceneBuilder . Update ( scene , visual , dirtyRects ) ;
}
foreach ( var r in dirtyRects . Coalesce ( ) )
{
_ renderQueue . Enqueue ( r ) ;
}
_d irty . Clear ( ) ;
dirtyRects . Coalesce ( ) ;
}
else
{
SceneBuilder . UpdateAll ( scene ) ;
_ renderQueue . Enqueue ( new Rect ( _ root . ClientSize ) ) ;
dirtyRects . Add ( new Rect ( _ root . ClientSize ) ) ;
}
_ scene = scene ;
lock ( _ scene )
{
_ scene = scene ;
_d irtyRects = dirtyRects ;
}
_d irty . Clear ( ) ;
_ needsUpdate = false ;
_ root . Invalidate ( new Rect ( _ root . ClientSize ) ) ;
}
@ -183,7 +182,16 @@ namespace Avalonia.Rendering
_ rendering = true ;
if ( ! _ renderQueue . IsEmpty )
Scene scene ;
DirtyRects dirtyRects ;
lock ( _ scene )
{
scene = _ scene ;
dirtyRects = _d irtyRects ;
}
if ( dirtyRects ! = null )
{
if ( _ renderTarget = = null )
{
@ -194,20 +202,21 @@ namespace Avalonia.Rendering
{
_ totalFrames + + ;
int count = 0 ;
using ( var context = _ renderTarget . CreateDrawingContext ( ) )
{
Rect rect ;
while ( _ renderQueue . TryDequeue ( out rect ) )
foreach ( var rect in dirtyRects )
{
context . PushClip ( rect ) ;
Render ( context , _ scene . Root , rect ) ;
context . PopClip ( ) ;
+ + count ;
}
if ( DrawFps )
{
RenderFps ( context ) ;
RenderFps ( context , count ) ;
}
}
}