性能调优

优化渲染和内存

Doconut 的资源概况主要受三件事支配:渲染 DPI缓存内容以及会话持续时间。本指南按影响顺序逐一介绍这些调节杠杆。

分辨率 — 最大的杠杆

ImageResolution(25–300 DPI)决定渲染时间和图像大小。大多数格式默认 200 DPI;图像和 PSD 默认 100 DPI。

csharp
// A document list preview doesn't need print quality
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

将 DPI 减半大约会把每页像素数降低到四分之一——渲染更快、传输更小、缓存占用更少。对于需要大量放大的场景(CAD、工程图纸),请保留 250–300 DPI。

对于嵌入大量图像的 PDF,PdfConfig 提供更细的调节:CompressImages + CompressQualityResizeImages + ResizeResolution,以及 CompressFast。对于普通图像,ImageConfig.MaxImagePixelSize(默认 3000 像素)限制输出尺寸。

页面缓存 — 内存 vs. 重新渲染

BaseConfig.CachePages(默认 true)在会话期间将每个已渲染的页面保存在内存中。这是交互式浏览的合适默认设置——用户可以前后滚动。当出现以下情况时请关闭它:

  • 文档体积巨大且仅浏览一次,从头到尾,
  • 并发会话众多会导致缓存页面数量成倍增长,
  • 你更倾向于为每次查看支付 CPU 而不是占用 RAM。
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

在客户端,ViewerConfig.CacheEnabled = true 会在浏览器内存中预加载一小段即将显示的页面图像窗口。这是每次查看的预取缓存,而非持久化的 localStorage

会话 — 你看不见的内存

每个打开的会话都会保存已解析的文档模型以及(在启用 CachePages 时)其渲染页面,直至滑动的 TimeOut(默认 60 分钟)在自上次请求以来到期。养成以下两种习惯可以控制其内存占用:

  • 关闭已完成的文档。 viewer.CloseDocument(token) 会立即释放引擎,而不是等待空闲窗口结束。
  • 合理设置超时时间。 用户只浏览两分钟的预览并不需要一小时的会话:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

请记住权衡:超时后小部件会显示 Document session not found. Please re-open document. —— 请选择与实际阅读时长相匹配的超时时间。

特定格式开关

  • ExcelMemoryOptimizationPreference 默认 开启,在渲染超大工作簿时可降低内存占用——保持开启,或在你愿意以少量速度提升换取更多内存时将其设为 falseSheetNames / PrintArea 可限制渲染仅包含重要内容。
  • 重定向模式有前置成本DefaultRender = false 会在打开时将整个文档转换为 PDF。它带来原生文本搜索能力,但在 500 页文档上,打开调用会承担该转换——不要盲目启用。
  • Linux/Docker 上的 Word/PPT:缺少字体会导致缓慢的回退探测和错误的度量;请将 FontFolders 指向包含你字体的目录。
  • Linux/macOS 上的演示文稿:PPT/PPTX/PPS/POT/ODP 文件可以打开,但使用当前的演示引擎渲染需要本地 libgdiplus 并在运行时开启 System.Drawing.EnableUnixSupport=true。其他格式族使用常规的跨平台渲染路径。

客户端策略

  • LargeDoc = true — 对超大文档的懒加载策略;页面在用户接近时才加载。
  • AutoLoad = false(默认)— 在实际调用 View(token) 之前不进行渲染。
  • ShowThumbs = false — 对单页或嵌入式预览跳过缩略图生成/请求。
  • 启用 FixedZoom 可避免自由缩放;在映射 C# 的 ViewerConfig 时,为小屏幕调节 FixedZoomPercentMobile(C# 默认 75)。

启动一次,而非每次请求

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 应放在 Program.cs 中——每次请求都注册编码是浪费工作;完全忘记注册会导致旧版代码页文档无法解析。

调优清单

  1. 设置用户体验可接受的最低 ImageResolution
  2. 交互式浏览时保持 CachePages 开启;一次性或高并发场景下关闭。
  3. 显式关闭会话;在使用突发的情况下缩短 TimeOut
  4. 客户端针对大文档使用 LargeDoc 并保持默认的 AutoLoad = false
  5. 仅在需要带文本的 PDF 投影时才使用 DefaultRender = false

此页面有帮助吗?