بهینه‌سازی عملکرد

بهینه‌سازی رندرینگ و حافظه

پروفایل منابع Doconut توسط سه مورد حاکم است: DPI رندر, آنچه در کش می‌ماند, و مدت زمان زندگی جلسات. این راهنما اهرم‌ها را به ترتیب تأثیرشان بررسی می‌کند.

وضوح — بزرگ‌ترین اهرم

ImageResolution (۲۵–۳۰۰ DPI) هم زمان رندر و هم اندازه تصویر را تعیین می‌کند. اکثر فرمت‌ها به‌صورت پیش‌فرض ۲۰۰ DPI هستند؛ تصاویر و PSD به‌صورت پیش‌فرض ۱۰۰ هستند.

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

نصف کردن DPI تقریباً تعداد پیکسل هر صفحه را به یک‌چهارم کاهش می‌دهد — رندرهای سریع‌تر، انتقال‌های کوچکتر، حافظه کش کمتر. برای مواردی که زوم زیاد دارند (CAD، نقشه‌های مهندسی) DPI بین ۲۵۰–۳۰۰ را رزرو کنید.

برای PDFهایی که حاوی تصاویر سنگین هستند، PdfConfig تنظیمات دقیق‌تری اضافه می‌کند: CompressImages + CompressQuality، ResizeImages + ResizeResolution و CompressFast. برای تصاویر ساده، ImageConfig.MaxImagePixelSize (پیش‌فرض ۳۰۰۰ پیکسل) اندازه خروجی را محدود می‌کند.

کش صفحات — حافظه در مقابل رندر مجدد

BaseConfig.CachePages (پیش‌فرض true) هر صفحه رندر شده را در حافظه برای طول عمر جلسه نگه می‌دارد. این پیش‌فرض مناسب برای مشاهده تعاملی است — کاربران به‌صورت عقب و جلو اسکرول می‌کنند. آن را غیرفعال کنید وقتی:

  • اسناد بسیار بزرگ هستند و یک‌بار از ابتدا تا انتها مشاهده می‌شوند،
  • تعداد زیادی جلسه همزمان باعث افزایش صفحات کش شده می‌شود،
  • ترجیح می‌دهید به‌جای نگه داشتن RAM، هزینه CPU را برای هر مشاهده بپردازید.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

در سمت کلاینت، ViewerConfig.CacheEnabled = true یک پنجره کوچک متحرک از تصاویر صفحات آینده را در حافظه مرورگر پیش‌بارگذاری می‌کند. این یک کش پیش‌بارگیری برای هر مشاهده است، نه localStorage دائمی.

جلسات — حافظه‌ای که نمی‌بینید

هر جلسه باز مدل سند تجزیه‌شده را به‌همراه (با CachePages) صفحات رندر شده‌اش نگه می‌دارد، تا زمانی که TimeOut متغیر (پیش‌فرض ۶۰ دقیقه) از آخرین درخواست بگذرد. دو عادت این را تحت کنترل نگه می‌دارند:

  • آنچه کارتان تمام شده است را ببندید. viewer.CloseDocument(token) بلافاصله موتور را آزاد می‌کند به‌جای انتظار برای پنجره بیکاری.
  • زمان‌سنجی را به‌درستی تنظیم کنید. پیش‌نمایشی که کاربران به‌مدت دو دقیقه نگاه می‌کنند نیازی به جلسه یک ساعته ندارد:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

تجارت را به‌خاطر بسپارید: پس از انقضا، ویجت پیام Document session not found. Please re-open document. را نشان می‌دهد — زمان‌سنجی را متناسب با جلسات واقعی خواندن انتخاب کنید.

سوئیچ‌های مخصوص فرمت

  • Excel: MemoryOptimizationPreference به‌صورت پیش‌فرض فعال است و هنگام رندر کتاب‌های کاری بسیار بزرگ، مصرف حافظه را کاهش می‌دهد — آن را فعال بگذارید، یا اگر مایلید حافظه را برای افزایش سرعت جزئی تعویض کنید، به false تنظیم کنید؛ SheetNames / PrintArea رندر را به موارد مهم محدود می‌کنند.
  • حالت Redirect هزینه اولیه دارد: DefaultRender = false کل سند را در زمان باز کردن به PDF تبدیل می‌کند. این امکان جستجوی بومی مبتنی بر متن را فراهم می‌کند، اما در سندی با ۵۰۰ صفحه، فراخوانی باز کردن این تبدیل را به‌همراه دارد — به‌صورت reflexive آن را فعال نکنید.
  • Word/PPT روی Linux/Docker: نبود فونت‌ها باعث بررسی بازگشتی کند و معیارهای نادرست می‌شود؛ FontFolders را به پوشه‌ای که فونت‌های شما در آن هستند اشاره کنید.
  • ارائه‌ها روی Linux/macOS: فایل‌های PPT/PPTX/PPS/POT/ODP می‌توانند باز شوند، اما رندر با موتور ارائه فعلی نیاز به libgdiplus بومی و سوئیچ زمان اجرا System.Drawing.EnableUnixSupport=true دارد. سایر خانواده‌های فرمت از مسیر رندرینگ معمولی چندپلتفرمی استفاده می‌کنند.

استراتژی‌های سمت کلاینت

  • LargeDoc = true — استراتژی بارگذاری تنبل برای اسناد بسیار بزرگ؛ صفحات همان‌طور که کاربر به آن‌ها نزدیک می‌شود بارگذاری می‌شوند.
  • AutoLoad = false (پیش‌فرض) — تا زمانی که واقعاً View(token) را صدا نزنید رندر نکنید.
  • ShowThumbs = false — برای پیش‌نمایش‌های تک‌صفحه یا توکار، تولید/درخواست تصویر بندانگشتی را نادیده بگیرید.
  • فعال‌سازی FixedZoom از تغییرات زوم آزاد جلوگیری می‌کند؛ وقتی یک ViewerConfig C# را نقشه‌برداری می‌کنید، FixedZoomPercentMobile (پیش‌فرض C# ۷۵) را برای صفحه‌نمایش‌های کوچک تنظیم کنید.

یک‌بار راه‌اندازی، نه به‌ازای هر درخواست

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) باید در Program.cs قرار گیرد — ثبت‌نام انکودینگ‌ها به‌ازای هر درخواست کار هدر رفته‌ای است؛ فراموش کردن کامل آن اسناد کد‑صفحهٔ قدیمی را خراب می‌کند.

فهرست بررسی تنظیمات

  1. پایین‌ترین ImageResolution که تجربه کاربری شما می‌پذیرد را تنظیم کنید.
  2. CachePages را برای مشاهده تعاملی فعال نگه دارید؛ برای حالت یک‌بار یا سناریوهای همزمانی بالا غیرفعال کنید.
  3. جلسات را به‌صورت صریح ببندید؛ در مواردی که استفاده پراکنده است TimeOut را کوتاه کنید.
  4. در سمت کلاینت برای اسناد بزرگ از LargeDoc به‌همراه پیش‌فرض AutoLoad = false استفاده کنید.
  5. فقط زمانی که به یک پروجکشن PDF حاوی متن نیاز دارید از DefaultRender = false استفاده کنید.

آیا این صفحه مفید بود؟