การปรับจูนประสิทธิภาพ

เพิ่มประสิทธิภาพการเรนเดอร์และหน่วยความจำ

โปรไฟล์ทรัพยากรของ Doconut ถูกครอบงำโดยสามสิ่ง: render DPI, what stays cached, และ how long sessions live. คู่มือนี้จะอธิบายคันโยกต่าง ๆ ตามลำดับความสำคัญของผลกระทบ.

ความละเอียด — คันโยกที่ใหญ่ที่สุด

ImageResolution (25–300 DPI) กำหนดทั้งเวลาเรนเดอร์และขนาดภาพ. รูปแบบส่วนใหญ่มีค่าเริ่มต้นที่ 200 DPI; ภาพและ PSD มีค่าเริ่มต้นที่ 100.

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

การลด DPI ลงครึ่งหนึ่งจะทำให้จำนวนพิกเซลต่อหน้าเหลือเพียงหนึ่งในสี่ — เรนเดอร์เร็วขึ้น, การถ่ายโอนข้อมูลเล็กลง, ใช้หน่วยความจำแคชน้อยลง. ควรเก็บ DPI ที่ 250–300 สำหรับกรณีที่ต้องซูมหนัก (เช่น CAD, แผนภาพวิศวกรรม).

สำหรับ PDF ที่มีภาพฝังจำนวนมาก, PdfConfig มีตัวเลือกละเอียดเพิ่ม: CompressImages + CompressQuality, ResizeImages + ResizeResolution, และ CompressFast. สำหรับภาพธรรมดา, ImageConfig.MaxImagePixelSize (ค่าเริ่มต้น 3000 px) จะจำกัดขนาดผลลัพธ์.

การแคชหน้า — หน่วยความจำ vs. การเรนเดอร์ใหม่

BaseConfig.CachePages (default true) เก็บหน้าที่เรนเดอร์ทั้งหมดไว้ในหน่วยความจำตลอดอายุของเซสชัน. นี่เป็นค่าเริ่มต้นที่เหมาะสำหรับการดูแบบโต้ตอบ — ผู้ใช้สามารถเลื่อนขึ้นลงได้อย่างอิสระ. ปิดการทำงานนี้เมื่อ:

  • เอกสารมีขนาดใหญ่มากและดูเพียงครั้งเดียวจากหน้าแรกถึงหน้าสุดท้าย,
  • มีหลายเซสชันพร้อมกันทำให้จำนวนหน้าที่แคชเพิ่มขึ้นหลายเท่า,
  • คุณต้องการประหยัด RAM และยอมรับการใช้ CPU มากกว่า.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

บนไคลเอนต์, ViewerConfig.CacheEnabled = true จะทำการโหลดล่วงหน้าหน้าภาพที่กำลังจะมาถึงในหน่วยความจำของเบราว์เซอร์เป็นหน้าต่างเล็ก ๆ ที่เคลื่อนที่. นี่เป็นแคชแบบ prefetch ต่อการดูหนึ่งครั้ง, ไม่ใช่ localStorage ที่คงถาวร.

เซสชัน — หน่วยความจำที่คุณไม่เห็น

ทุกเซสชันที่เปิดอยู่จะเก็บโมเดลเอกสารที่ถูกแยกวิเคราะห์พร้อมกับ (เมื่อเปิด CachePages) หน้าที่เรนเดอร์ไว้, จนกว่า TimeOut ที่เลื่อนตาม (ค่าเริ่มต้น 60 นาที) จะหมด ตั้งแต่คำขอล่าสุด. มีสองวิธีที่ช่วยควบคุมได้:

  • ปิดเอกสารเมื่อใช้งานเสร็จ viewer.CloseDocument(token) จะปล่อยเอนจินทันทีโดยไม่ต้องรอช่วงเวลาว่าง.
  • กำหนดค่า TimeOut ให้เหมาะสม ตัวอย่างเช่น การพรีวิวที่ผู้ใช้ดูเพียงสองนาทีไม่จำเป็นต้องใช้เซสชันหนึ่งชั่วโมง:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

จำไว้ว่าเมื่อหมดเวลา widget จะโชว์ข้อความ Document session not found. Please re-open document. — เลือกค่า TimeOut ที่สอดคล้องกับช่วงเวลาการอ่านจริงของผู้ใช้.

สวิตช์เฉพาะรูปแบบ

  • Excel: MemoryOptimizationPreference เปิดโดยค่าเริ่มต้น และช่วยลดการใช้หน่วยความจำเมื่อเรนเดอร์เวิร์กบุ๊กขนาดใหญ่มาก — ควรเปิดไว้, หรือตั้งเป็น false หากต้องการแลกเปลี่ยนหน่วยความจำเพื่อความเร็วเล็กน้อย; SheetNames / PrintArea จะจำกัดการเรนเดอร์ให้เฉพาะส่วนที่สำคัญ.
  • โหมดรีไดเรกต์มีค่าใช้จ่ายล่วงหน้า: DefaultRender = false จะทำการแปลง เอกสารทั้งหมด เป็น PDF ขณะเปิด. วิธีนี้ทำให้ค้นหาข้อความแบบเนทีฟได้, แต่สำหรับเอกสาร 500 หน้า การเปิดจะต้องทำการแปลงนี้ — อย่าเปิดใช้งานโดยอัตโนมัติ.
  • Word/PPT บน Linux/Docker: ฟอนต์ที่หายไปทำให้การสำรวจสำรองช้าและได้เมตริกที่ผิด; ตั้งค่า FontFolders ให้ชี้ไปยังไดเรกทอรีที่มีฟอนต์ของคุณ.
  • การนำเสนอบน Linux/macOS: ไฟล์ PPT/PPTX/PPS/POT/ODP สามารถเปิดได้, แต่การเรนเดอร์ด้วยเอนจินการนำเสนอปัจจุบันต้องใช้ libgdiplus เนทีฟและสวิตช์รันไทม์ System.Drawing.EnableUnixSupport=true. รูปแบบไฟล์อื่นใช้เส้นทางการเรนเดอร์ข้ามแพลตฟอร์มปกติ.

กลยุทธ์ด้านไคลเอนต์

  • LargeDoc = true — กลยุทธ์โหลดแบบ lazy สำหรับเอกสารขนาดใหญ่มาก; หน้าโหลดเมื่อผู้ใช้เข้าใกล้.
  • AutoLoad = false (ค่าเริ่มต้น) — ไม่ทำการเรนเดอร์จนกว่าจะเรียก View(token) จริง.
  • ShowThumbs = false — ข้ามการสร้าง/ร้องขอรูปย่อสำหรับตัวอย่างหน้าเดียวหรือฝัง.
  • การเปิดใช้งาน FixedZoom จะหลีกเลี่ยงการเปลี่ยนแปลงซูมแบบอิสระ; เมื่อคุณแมป ViewerConfig ของ C#, ปรับ FixedZoomPercentMobile (ค่าเริ่มต้น C# 75) สำหรับหน้าจอขนาดเล็ก.

เริ่มต้นครั้งเดียว, ไม่ใช่ต่อคำขอ

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) ควรอยู่ใน Program.cs — การลงทะเบียนการเข้ารหัสต่อคำขอเป็นงานที่เสียเปล่า; การลืมทำเลยทั้งหมดจะทำให้เอกสารที่ใช้ code‑page เก่าเสีย.

การกระจายงานข้ามโหนด

สิ่งที่กล่าวมาข้างต้นเป็นการปรับจูนการเรนเดอร์บนโหนดเดียวตามความต้องการ. เมื่อโหนดเดียวไม่สามารถรับภาระได้, คันโยกต่อไปไม่ใช่การเพิ่มค่าให้ใหญ่ขึ้น — แต่เป็นการเผยแพร่ผลลัพธ์ของเอกสารลงในที่เก็บข้อมูลร่วมหนึ่งครั้งและให้ทุกโหนดบริการจากที่นั้น. วิธีนี้เปลี่ยนโมเดลต้นทุน: การเรนเดอร์ทำเพียงครั้งเดียวต่อเอกสารแทนที่จะทำต่อเซสชัน, และการร้องขอหน้าเปลี่ยนเป็นการอ่านไฟล์. ดูที่ การปรับใช้แบบกระจาย.

รายการตรวจสอบการปรับจูน

  1. ตั้งค่า ImageResolution ที่ต่ำที่สุดที่ UX ของคุณยอมรับ.
  2. เปิด CachePages สำหรับการดูแบบโต้ตอบ; ปิดสำหรับสถานการณ์การดูครั้งเดียวหรือการใช้งานพร้อมกันสูง.
  3. ปิดเซสชันอย่างชัดเจน; ลด TimeOut เมื่อการใช้งานเป็นแบบกระติก.
  4. ใช้ LargeDoc พร้อมกับค่าเริ่มต้น AutoLoad = false บนไคลเอนต์สำหรับเอกสารขนาดใหญ่.
  5. ใช้ DefaultRender = false เฉพาะเมื่อคุณต้องการการแปลงเป็น PDF ที่มีข้อความ.

หน้านี้เป็นประโยชน์หรือไม่?