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

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

پروفایل منابع 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 رندر را به موارد مهم محدود می‌کنند.
  • حالت تغییر مسیر هزینه اولیه دارد: 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 استفاده کنید.

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