Browse Source

Slightly improve drawing performance

Equbuxu 3 years ago
parent
commit
ad9260381f
1 changed files with 7 additions and 22 deletions
  1. 7 22
      src/PixiEditorPrototype/Models/Rendering/WriteableBitmapUpdater.cs

+ 7 - 22
src/PixiEditorPrototype/Models/Rendering/WriteableBitmapUpdater.cs

@@ -15,11 +15,11 @@ namespace PixiEditorPrototype.Models.Rendering
     public class WriteableBitmapUpdater
     {
         private DocumentChangeTracker tracker;
-        private Surface? backSurface;
         private static SKPaint BlendingPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver };
         private static SKPaint ReplacingPaint = new SKPaint() { BlendMode = SKBlendMode.Src };
         private static SKPaint SelectionPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver, Color = new(0xa0FFFFFF) };
         private static SKPaint ClearPaint = new SKPaint() { BlendMode = SKBlendMode.Src, Color = SKColors.Transparent };
+        private Vector2i oldSize = new(0, 0);
 
         public WriteableBitmapUpdater(DocumentChangeTracker tracker)
         {
@@ -82,10 +82,9 @@ namespace PixiEditorPrototype.Models.Rendering
         private List<IRenderInfo> Render(IReadOnlyList<IChangeInfo> changes, SKSurface screenSurface, Vector2i screenSize)
         {
             bool redrawEverything = false;
-            if (backSurface == null || backSurface.Size != screenSize)
+            if (oldSize != screenSize)
             {
-                backSurface?.Dispose();
-                backSurface = new(screenSize);
+                oldSize = screenSize;
                 redrawEverything = true;
             }
             HashSet<Vector2i>? chunks = null;
@@ -100,15 +99,14 @@ namespace PixiEditorPrototype.Models.Rendering
             // draw to back surface
             if (redrawEverything)
             {
-                RenderScreen(screenSize, backSurface.SkiaSurface, tracker.Document.ReadOnlyStructureRoot);
+                RenderScreen(screenSize, screenSurface);
                 infos.Add(new DirtyRect_RenderInfo(new Vector2i(0, 0), screenSize));
             }
             else
             {
                 foreach (var chunkPos in chunks!)
                 {
-                    backSurface.SkiaSurface.Canvas.DrawRect(SKRect.Create(chunkPos * ChunkyImage.ChunkSize, new(ChunkyImage.ChunkSize, ChunkyImage.ChunkSize)), ClearPaint);
-                    RenderChunk(chunkPos, backSurface.SkiaSurface);
+                    RenderChunk(chunkPos, screenSurface);
                     infos.Add(new DirtyRect_RenderInfo(
                         chunkPos * ChunkyImage.ChunkSize,
                         new(ChunkyImage.ChunkSize, ChunkyImage.ChunkSize)
@@ -116,23 +114,10 @@ namespace PixiEditorPrototype.Models.Rendering
                 }
             }
 
-            // transfer the back surface to the screen surface
-
-            foreach (var info in infos)
-            {
-                if (info is DirtyRect_RenderInfo dirtyRect)
-                {
-                    screenSurface.Canvas.Save();
-                    screenSurface.Canvas.ClipRect(SKRect.Create(dirtyRect.Pos, dirtyRect.Size));
-                    screenSurface.Canvas.DrawSurface(backSurface.SkiaSurface, 0, 0, ReplacingPaint);
-                    screenSurface.Canvas.Restore();
-                }
-            }
-
             return infos;
         }
 
-        private void RenderScreen(Vector2i screenSize, SKSurface screenSurface, IReadOnlyFolder structureRoot)
+        private void RenderScreen(Vector2i screenSize, SKSurface screenSurface)
         {
             int chunksWidth = (int)Math.Ceiling(screenSize.X / (float)ChunkyImage.ChunkSize);
             int chunksHeight = (int)Math.Ceiling(screenSize.Y / (float)ChunkyImage.ChunkSize);
@@ -149,7 +134,7 @@ namespace PixiEditorPrototype.Models.Rendering
         private void RenderChunk(Vector2i chunkPos, SKSurface screenSurface)
         {
             using Chunk renderedChunk = ChunkRenderer.RenderWholeStructure(chunkPos, tracker.Document.ReadOnlyStructureRoot);
-            screenSurface.Canvas.DrawSurface(renderedChunk.Surface.SkiaSurface, chunkPos * ChunkyImage.ChunkSize, BlendingPaint);
+            screenSurface.Canvas.DrawSurface(renderedChunk.Surface.SkiaSurface, chunkPos * ChunkyImage.ChunkSize, ReplacingPaint);
 
             if (tracker.Document.ReadOnlySelection.ReadOnlyIsEmptyAndInactive)
                 return;