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

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

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

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

ImageResolution (25–300 DPI) קובע הן את זמן הרינדור והן את גודל התמונה. רוב הפורמטים משתמשים ב‑200 DPI כברירת מחדל; תמונות ו‑PSD משתמשים ב‑100.

csharp
// תצוגת רשימת מסמכים אינה דורשת איכות הדפסה
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 עם טקסט.

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