Browse Source

Speed up rendering even more

Equbuxu 3 years ago
parent
commit
0229b10d1a

+ 33 - 27
src/ChangeableDocument/DocumentChangeTracker.cs

@@ -91,37 +91,43 @@ namespace ChangeableDocument
             return info;
             return info;
         }
         }
 
 
-        public async Task<List<IChangeInfo?>> ProcessActions(List<IAction> actions)
+        private List<IChangeInfo?> ProcessActionList(List<IAction> actions)
         {
         {
-            List<IChangeInfo?> result = await Task.Run(() =>
+            List<IChangeInfo?> changeInfos = new();
+            foreach (var action in actions)
             {
             {
-                List<IChangeInfo?> changeInfos = new();
-                foreach (var action in actions)
+                switch (action)
                 {
                 {
-                    switch (action)
-                    {
-                        case IMakeChangeAction act:
-                            changeInfos.Add(ProcessMakeChangeAction(act));
-                            break;
-                        case IStartOrUpdateChangeAction act:
-                            changeInfos.Add(ProcessStartOrUpdateChangeAction(act));
-                            break;
-                        case IEndChangeAction act:
-                            changeInfos.Add(ProcessEndChangeAction(act));
-                            break;
-                        case Undo_Action act:
-                            changeInfos.Add(Undo());
-                            break;
-                        case Redo_Action act:
-                            changeInfos.Add(Redo());
-                            break;
-                        default:
-                            throw new Exception("Unknown action type");
-                    }
+                    case IMakeChangeAction act:
+                        changeInfos.Add(ProcessMakeChangeAction(act));
+                        break;
+                    case IStartOrUpdateChangeAction act:
+                        changeInfos.Add(ProcessStartOrUpdateChangeAction(act));
+                        break;
+                    case IEndChangeAction act:
+                        changeInfos.Add(ProcessEndChangeAction(act));
+                        break;
+                    case Undo_Action act:
+                        changeInfos.Add(Undo());
+                        break;
+                    case Redo_Action act:
+                        changeInfos.Add(Redo());
+                        break;
+                    default:
+                        throw new Exception("Unknown action type");
                 }
                 }
-                return changeInfos;
-            }).ConfigureAwait(true);
-            return result;
+            }
+            return changeInfos;
+        }
+
+        public async Task<List<IChangeInfo?>> ProcessActions(List<IAction> actions)
+        {
+            return await Task.Run(() => ProcessActionList(actions)).ConfigureAwait(true);
+        }
+
+        public List<IChangeInfo?> ProcessActionsSync(List<IAction> actions)
+        {
+            return ProcessActionList(actions);
         }
         }
     }
     }
 }
 }

+ 6 - 1
src/PixiEditorPrototype/Models/ActionAccumulator.cs

@@ -39,12 +39,14 @@ namespace PixiEditorPrototype.Models
             if (executing || queuedActions.Count == 0)
             if (executing || queuedActions.Count == 0)
                 return;
                 return;
             executing = true;
             executing = true;
+
             while (queuedActions.Count > 0)
             while (queuedActions.Count > 0)
             {
             {
                 var toExecute = queuedActions;
                 var toExecute = queuedActions;
                 queuedActions = new List<IAction>();
                 queuedActions = new List<IAction>();
 
 
                 var result = await tracker.ProcessActions(toExecute);
                 var result = await tracker.ProcessActions(toExecute);
+                //var result = tracker.ProcessActionsSync(toExecute);
 
 
                 foreach (IChangeInfo? info in result)
                 foreach (IChangeInfo? info in result)
                 {
                 {
@@ -53,6 +55,8 @@ namespace PixiEditorPrototype.Models
 
 
                 document.FinalBitmap.Lock();
                 document.FinalBitmap.Lock();
                 var renderResult = await renderer.ProcessChanges(result!, document.FinalBitmapSurface, new(document.FinalBitmap.PixelWidth, document.FinalBitmap.PixelHeight));
                 var renderResult = await renderer.ProcessChanges(result!, document.FinalBitmapSurface, new(document.FinalBitmap.PixelWidth, document.FinalBitmap.PixelHeight));
+                //var renderResult = renderer.ProcessChangesSync(result!, document.FinalBitmapSurface, new(document.FinalBitmap.PixelWidth, document.FinalBitmap.PixelHeight));
+
 
 
                 SKRectI finalRect = SKRectI.Create(0, 0, document.FinalBitmap.PixelWidth, document.FinalBitmap.PixelHeight);
                 SKRectI finalRect = SKRectI.Create(0, 0, document.FinalBitmap.PixelWidth, document.FinalBitmap.PixelHeight);
                 foreach (IRenderInfo info in renderResult)
                 foreach (IRenderInfo info in renderResult)
@@ -65,8 +69,9 @@ namespace PixiEditorPrototype.Models
                     }
                     }
                 }
                 }
                 document.FinalBitmap.Unlock();
                 document.FinalBitmap.Unlock();
+
+                document.View?.ForceRefreshFinalImage();
             }
             }
-            document.View?.ForceRefreshFinalImage();
 
 
             executing = false;
             executing = false;
         }
         }

+ 5 - 0
src/PixiEditorPrototype/Models/Rendering/WriteableBitmapUpdater.cs

@@ -31,6 +31,11 @@ namespace PixiEditorPrototype.Models.Rendering
             return await Task.Run(() => Render(changes, screenSurface, screenSize)).ConfigureAwait(true);
             return await Task.Run(() => Render(changes, screenSurface, screenSize)).ConfigureAwait(true);
         }
         }
 
 
+        public List<IRenderInfo> ProcessChangesSync(IReadOnlyList<IChangeInfo> changes, SKSurface screenSurface, Vector2i screenSize)
+        {
+            return Render(changes, screenSurface, screenSize);
+        }
+
         private HashSet<Vector2i>? FindChunksToRerender(IReadOnlyList<IChangeInfo> changes)
         private HashSet<Vector2i>? FindChunksToRerender(IReadOnlyList<IChangeInfo> changes)
         {
         {
             HashSet<Vector2i> chunks = new();
             HashSet<Vector2i> chunks = new();