Ver Fonte

Performance improvements

Marcin Ziąbek há 1 ano atrás
pai
commit
670bd3548a

+ 1 - 1
Source/QuestPDF.Previewer/CommunicationService.cs

@@ -80,7 +80,7 @@ class CommunicationService
         {
         {
             using var memoryStream = new MemoryStream();
             using var memoryStream = new MemoryStream();
             await request.Form.Files.GetFile(renderedPage.ToString()).CopyToAsync(memoryStream);
             await request.Form.Files.GetFile(renderedPage.ToString()).CopyToAsync(memoryStream);
-            renderedPage.Image = SKImage.FromEncodedData(memoryStream.ToArray());
+            renderedPage.Image = SKImage.FromEncodedData(memoryStream.ToArray()).ToRasterImage(true);
         }
         }
 
 
         Task.Run(() => OnPageSnapshotsProvided(renderedPages));
         Task.Run(() => OnPageSnapshotsProvided(renderedPages));

+ 7 - 5
Source/QuestPDF.Previewer/InteractiveCanvas.cs

@@ -1,4 +1,5 @@
-using Avalonia;
+using System.Collections.Concurrent;
+using Avalonia;
 using Avalonia.Media;
 using Avalonia.Media;
 using Avalonia.Platform;
 using Avalonia.Platform;
 using Avalonia.Rendering.SceneGraph;
 using Avalonia.Rendering.SceneGraph;
@@ -13,7 +14,7 @@ class InteractiveCanvas : ICustomDrawOperation
     public float RenderingScale { get; set; }
     public float RenderingScale { get; set; }
 
 
     private List<DocumentStructure.PageSize> PageSizes { get; set; } = new();
     private List<DocumentStructure.PageSize> PageSizes { get; set; } = new();
-    private List<RenderedPageSnapshot> PageSnapshotCache { get; set; } = new();
+    private ConcurrentBag<RenderedPageSnapshot> PageSnapshotCache { get; set; } = new();
 
 
     private float Width => (float)Bounds.Width;
     private float Width => (float)Bounds.Width;
     private float Height => (float)Bounds.Height;
     private float Height => (float)Bounds.Height;
@@ -84,7 +85,8 @@ class InteractiveCanvas : ICustomDrawOperation
 
 
     public void AddSnapshots(ICollection<RenderedPageSnapshot> snapshots)
     public void AddSnapshots(ICollection<RenderedPageSnapshot> snapshots)
     {
     {
-        PageSnapshotCache.AddRange(snapshots);
+        foreach (var snapshot in snapshots)
+            PageSnapshotCache.Add(snapshot);
     }
     }
     
     
     #endregion
     #endregion
@@ -147,7 +149,7 @@ class InteractiveCanvas : ICustomDrawOperation
     
     
     #region rendering
     #region rendering
 
 
-    private int PreferredZoomLevel => (int)Math.Clamp(Math.Ceiling(Math.Log2(Scale * RenderingScale)), -2, 2);
+    private int PreferredZoomLevel => (int)Math.Min(3, Math.Ceiling(Math.Log2(Scale * RenderingScale)));
     
     
     private IEnumerable<(int pageIndex, float verticalOffset)> GetVisiblePages(float padding = 100)
     private IEnumerable<(int pageIndex, float verticalOffset)> GetVisiblePages(float padding = 100)
     {
     {
@@ -227,7 +229,7 @@ class InteractiveCanvas : ICustomDrawOperation
         
         
         using var drawImagePaint = new SKPaint
         using var drawImagePaint = new SKPaint
         {
         {
-            FilterQuality = SKFilterQuality.High
+            FilterQuality = SKFilterQuality.Medium // optimal for down-scaling
         };
         };
 
 
         var renderingScale = (float)Math.Pow(2, renderedSnapshot.ZoomLevel);
         var renderingScale = (float)Math.Pow(2, renderedSnapshot.ZoomLevel);