כוונון ביצועים

אופטימיזציה של רינדור וזיכרון

פרופיל המשאבים של Doconut נשלט על ידי שלושה גורמים: רזולוציית רינדור DPI, מה נשאר במטמון, ו-כמה זמן סשנים נשארים פעילים. מדריך זה מסביר את המנופים לפי סדר החשיבות.

רזולוציה — המנוף הגדול ביותר

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 לחצי מקצרת בקירוב את מספר הפיקסלים לעמוד לארבעה — רינדור מהיר יותר, העברות קטנות יותר, פחות זיכרון קאש. שמור 250–300 DPI למקרים שבהם יש צורך בזום גבוה (CAD, שרטוטי הנדסה).

ב‑PDFים עם תמונות משולבות בכבדות, PdfConfig מוסיף אפשרויות מדויקות יותר: CompressImages + CompressQuality, ResizeImages + ResizeResolution, ו‑CompressFast. בתמונות רגילות, ImageConfig.MaxImagePixelSize (ברירת מחדל 3000 פיקסלים) מגביל את גודל הפלט.

קאשינג של דפים — זיכרון מול רינדור מחדש

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. — בחר משך זמן שמתאים לסשנים אמיתיים של קריאה.

מתגים ספציפיים לפורמט

  • Excel: MemoryOptimizationPreference הוא פעיל כברירת מחדל ומקטין את טביעת הרגל בזיכרון בעת רינדור חוברות גדולות מאוד — השאר אותו פעיל, או הגדר אותו ל‑false אם אתה מוכן להחליף זיכרון בתמורה לשיפור מהירות קטן; SheetNames / PrintArea מצמצמים את הרינדור למה שחשוב.
  • מצב הפנייה (Redirect) בעל עלות מקדימה: DefaultRender = false ממיר את כל המסמך ל‑PDF בזמן הפתיחה. זה מאפשר חיפוש טקסטואלי מקורי, אך במסמך של 500 עמודים קריאת הפתיחה כוללת המרה זו — אל תפעיל זאת באופן אוטומטי.
  • 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# 75) למסכים קטנים.

אתחול פעם אחת, לא לכל בקשה

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) צריך להיות ב‑Program.cs — רישום קידודים לכל בקשה הוא עבודה מבוזבזת; שכחתו לחלוטין משבשת מסמכי קוד‑עמוד ישנים.

רשימת בדיקה לכוונון

  1. הגדר את ImageResolution הנמוך ביותר שה‑UX שלך מקבל.
  2. השאר CachePages פעיל לצפייה אינטראקטיבית; כבה אותו לתרחישים של מעבר חד או ריבוי גבוה.
  3. סגור סשנים במפורש; קצץ את TimeOut כאשר השימוש הוא בתנודות.
  4. השתמש ב‑LargeDoc + AutoLoad = false כברירת מחדל בצד הלקוח למסמכים גדולים.
  5. השתמש ב‑DefaultRender = false רק כאשר אתה צריך פרויקט PDF נושא טקסט.

האם דף זה היה מועיל?