Ladění výkonu

Optimalizace vykreslování a paměti

Profil zdrojů Doconutu je ovládán třemi věcmi: render DPI, co zůstává v keši, a jak dlouho relace žijí. Tento průvodce prochází pákami v pořadí podle dopadu.

Rozlišení — největší páka

ImageResolution (25–300 DPI) určuje jak dobu vykreslování, tak velikost obrázku. Většina formátů má výchozí hodnotu 200 DPI; obrázky a PSD mají výchozí 100.

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

Poloviční DPI přibližně čtvrtí počet pixelů na stránku — rychlejší vykreslování, menší přenosy, méně paměti pro keš. Rezervujte 250–300 DPI pro případy s častým přiblížením (CAD, technické výkresy).

Pro PDF soubory s velkým množstvím vložených obrázků PdfConfig přidává jemnější ovládací prvky: CompressImages + CompressQuality, ResizeImages + ResizeResolution a CompressFast. Pro běžné obrázky omezuje ImageConfig.MaxImagePixelSize (výchozí 3000 px) velikost výstupu.

Kešování stránek — paměť vs. opětovné vykreslení

BaseConfig.CachePages (výchozí true) uchovává každou vykreslenou stránku v paměti po celou dobu trvání relace. To je správné výchozí nastavení pro interaktivní prohlížení — uživatelé posouvají dopředu i dozadu. Vypněte jej, když:

  • dokumenty jsou obrovské a jsou prohlíženy jednou, od začátku do konce,
  • mnoho souběžných relací by násobilo počet kešovaných stránek,
  • raději zaplatíte CPU za zobrazení než budete držet RAM.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

Na klientovi ViewerConfig.CacheEnabled = true přednačítá malé posuvné okno nadcházejících obrázků stránek do paměti prohlížeče. Jedná se o keš přednačítání na úrovni zobrazení, nikoli trvalé localStorage.

Relace — paměť, kterou nevidíte

Každá otevřená relace drží parsovaný model dokumentu plus (s CachePages) jeho vykreslené stránky, dokud neuplyne posuvný TimeOut (výchozí 60 minut) od posledního požadavku. Dvě návyky udržují tuto paměť pod kontrolou:

  • Zavřete to, s čím jste skončili. viewer.CloseDocument(token) uvolní engine okamžitě místo čekání na nečinnost.
  • Správně nastavte časový limit. Náhled, na který uživatelé mrknou dva minuty, nepotřebuje hodinovou relaci:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Pamatujte na kompromis: po vypršení časového limitu widget zobrazí Document session not found. Please re-open document. — zvolte časový limit, který odpovídá skutečným čtecím relacím.

Formátově specifické přepínače

  • Excel: MemoryOptimizationPreference je ve výchozím nastavení zapnutý a snižuje paměťovou stopu při vykreslování velmi velkých sešitů — nechte jej zapnutý, nebo jej nastavte na false, pokud chcete vyměnit paměť za malý nárůst rychlosti; SheetNames / PrintArea omezují vykreslování na podstatné části.
  • Režim přesměrování má počáteční náklad: DefaultRender = false převádí celý dokument do PDF při otevření. Získává nativní textové vyhledávání, ale u 500‑stránkového dokumentu otevření zahrnuje tuto konverzi — neaktivujte jej reflexivně.
  • Word/PPT na Linux/Docker: chybějící fonty způsobují pomalé fallbackové zkoušení a špatné metriky; nasměrujte FontFolders na adresář s vašimi fonty.
  • Prezentace na Linux/macOS: soubory PPT/PPTX/PPS/POT/ODP lze otevřít, ale vykreslování pomocí současného prezentačního enginu vyžaduje nativní libgdiplus a runtime přepínač System.Drawing.EnableUnixSupport=true. Ostatní formátové rodiny používají běžnou multiplatformní cestu vykreslování.

Strategie na straně klienta

  • LargeDoc = true — strategie lazy-load pro velmi velké dokumenty; stránky se načítají, jak se uživatel k nim přibližuje.
  • AutoLoad = false (výchozí) — nevykreslujte, dokud nepovoláte View(token).
  • ShowThumbs = false — přeskočte generování/požadavky na miniatury u jednostránkových nebo vložených náhledů.
  • Povolení FixedZoom zabraňuje volným změnám přiblížení; když mapujete C# ViewerConfig, nastavte FixedZoomPercentMobile (výchozí C# 75) pro malé obrazovky.

Spuštění jednou, ne při každém požadavku

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) patří do Program.cs — registrace kódování při každém požadavku je zbytečná práce; úplné zapomenutí vede k porušení starších dokumentů s kódovými stránkami.

Rozložení práce mezi uzly

Vše výše ladí vykreslování na jednom uzlu na vyžádání. Když jeden uzel nedokáže zatížení absorbovat, další páka není větší otočka — jde o publikování artefaktů dokumentu jednou do sdíleného úložiště a umožnění každému uzlu je obsluhovat. To mění model nákladů: vykreslování probíhá jednou na dokument místo jednou na relaci a požadavky na stránky se stávají čtením souborů. Viz Distribuovaná nasazení.

Kontrolní seznam ladění

  1. Nastavte nejnižší ImageResolution, kterou vaše UX akceptuje.
  2. Nechte CachePages zapnuté pro interaktivní prohlížení; vypnuté pro jednorázové nebo vysoce souběžné scénáře.
  3. Explicitně uzavírejte relace; zkracujte TimeOut, kde je používání burstové.
  4. Použijte LargeDoc + výchozí AutoLoad = false na klientovi pro velké dokumenty.
  5. Použijte DefaultRender = false pouze když potřebujete PDF projekci s textem.

Byla tato stránka užitečná?