Tối ưu hiệu năng

Tối ưu việc render và bộ nhớ

Hồ sơ tài nguyên của Doconut được chi phối bởi ba yếu tố: render DPI, cái gì được lưu trong bộ nhớ đệm, và thời gian tồn tại của các phiên. Hướng dẫn này sẽ đi qua các công tắc theo thứ tự ảnh hưởng.

Độ phân giải — công tắc quan trọng nhất

ImageResolution (25–300 DPI) quyết định cả thời gian render và kích thước ảnh. Hầu hết các định dạng mặc định là 200 DPI; hình ảnh và PSD mặc định là 100.

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

Giảm một nửa DPI sẽ giảm khoảng một phần tư số pixel mỗi trang — render nhanh hơn, truyền tải ít hơn, bộ nhớ đệm giảm. Dành 250–300 DPI cho các trường hợp sử dụng nhiều thu phóng (CAD, bản vẽ kỹ thuật).

Đối với PDF có nhiều hình ảnh nhúng, PdfConfig cung cấp các tùy chỉnh chi tiết hơn: CompressImages + CompressQuality, ResizeImages + ResizeResolution, và CompressFast. Đối với hình ảnh đơn, ImageConfig.MaxImagePixelSize (mặc định 3000 px) giới hạn kích thước đầu ra.

Bộ nhớ đệm trang — bộ nhớ vs. render lại

BaseConfig.CachePages (mặc định true) giữ mọi trang đã render trong bộ nhớ suốt thời gian phiên. Đây là mặc định phù hợp cho việc xem tương tác — người dùng cuộn lên xuống. Tắt nó khi:

  • tài liệu rất lớn và chỉ xem một lần, từ đầu tới cuối,
  • nhiều phiên đồng thời sẽ làm tăng số trang được lưu trong bộ nhớ đệm,
  • bạn muốn tiêu tốn CPU cho mỗi lần xem hơn là giữ RAM.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

Ở phía client, ViewerConfig.CacheEnabled = true tải trước một cửa sổ di chuyển nhỏ các ảnh trang sắp tới trong bộ nhớ trình duyệt. Đây là bộ nhớ đệm prefetch cho mỗi lần xem, không phải localStorage lâu dài.

Phiên — bộ nhớ bạn không thấy

Mỗi phiên mở giữ mô hình tài liệu đã phân tích cùng (với CachePages) các trang đã render, cho đến khi thời gian trượt TimeOut (mặc định 60 phút) hết kể từ yêu cầu cuối cùng. Hai thói quen giúp kiểm soát điều này:

  • Đóng những gì bạn đã xong. viewer.CloseDocument(token) giải phóng engine ngay lập tức thay vì chờ qua khoảng thời gian nhàn rỗi.
  • Điều chỉnh thời gian chờ hợp lý. Một bản xem trước mà người dùng chỉ nhìn trong hai phút không cần một phiên một giờ:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Hãy nhớ sự đánh đổi: sau khi hết hạn, widget sẽ hiển thị Document session not found. Please re-open document. — chọn thời gian chờ phù hợp với các phiên đọc thực tế.

Các công tắc riêng theo định dạng

  • Excel: MemoryOptimizationPreference được bật mặc định và giảm lượng bộ nhớ khi render các workbook rất lớn — để nó bật, hoặc đặt thành false nếu bạn muốn đổi bộ nhớ lấy một chút tăng tốc; SheetNames / PrintArea giới hạn việc render chỉ những phần cần thiết.
  • Chế độ chuyển hướng có chi phí ban đầu: DefaultRender = false chuyển toàn bộ tài liệu sang PDF khi mở. Điều này cho phép tìm kiếm dựa trên văn bản gốc, nhưng trên tài liệu 500 trang, lời gọi mở sẽ thực hiện chuyển đổi — không bật nó một cách phản xạ.
  • Word/PPT trên Linux/Docker: thiếu phông chữ gây quá trình dự phòng chậm và các chỉ số sai; chỉ định FontFolders tới thư mục chứa phông chữ của bạn.
  • Bản trình chiếu trên Linux/macOS: các tệp PPT/PPTX/PPS/POT/ODP có thể mở, nhưng việc render với engine trình chiếu hiện tại yêu cầu libgdiplus gốc và công tắc runtime System.Drawing.EnableUnixSupport=true. Các họ định dạng khác sử dụng đường dẫn render đa nền tảng bình thường.

Chiến lược phía client

  • LargeDoc = true — chiến lược tải lười cho tài liệu rất lớn; các trang được tải khi người dùng tiếp cận.
  • AutoLoad = false (mặc định) — không render cho đến khi bạn thực sự gọi View(token).
  • ShowThumbs = false — bỏ qua việc tạo/đòi hỏi thumbnail cho các bản xem trước một trang hoặc nhúng.
  • Kích hoạt FixedZoom tránh các thay đổi thu phóng tự do; khi bạn ánh xạ một ViewerConfig C#, điều chỉnh FixedZoomPercentMobile (mặc định C# 75) cho màn hình nhỏ.

Khởi động một lần, không phải mỗi yêu cầu

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) nên được đặt trong Program.cs — đăng ký các bộ mã mỗi yêu cầu là công việc lãng phí; quên hoàn toàn nó sẽ làm hỏng các tài liệu sử dụng code-page cũ.

Danh sách kiểm tra tối ưu

  1. Đặt ImageResolution thấp nhất mà trải nghiệm người dùng của bạn chấp nhận.
  2. Giữ CachePages bật cho việc xem tương tác; tắt cho các trường hợp một lần duyệt hoặc đồng thời cao.
  3. Đóng các phiên một cách rõ ràng; rút ngắn TimeOut khi việc sử dụng có tính bùng nổ.
  4. Sử dụng LargeDoc + AutoLoad = false mặc định trên client cho tài liệu lớn.
  5. Chỉ dùng DefaultRender = false khi bạn cần một bản PDF mang văn bản.

Trang này có hữu ích không?