Тонкая настройка производительности

Оптимизация рендеринга и памяти

Ресурсный профиль 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 для сценариев с интенсивным масштабированием (САПР, инженерные чертежи).

Для PDF с большим количеством встроенных изображений PdfConfig предоставляет более тонкие настройки: CompressImages + CompressQuality, ResizeImages + ResizeResolution и CompressFast. Для обычных изображений ImageConfig.MaxImagePixelSize (по умолчанию 3000 px) ограничивает размер вывода.

Кеширование страниц — память vs. повторный рендер

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 ограничивают рендеринг только нужными областями.
  • Режим перенаправления имеет начальные затраты: 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 избавляет от произвольных изменений масштаба; при сопоставлении C# ViewerConfig настройте FixedZoomPercentMobile (по умолчанию C# 75) для небольших экранов.

Инициализировать один раз, а не при каждом запросе

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) следует разместить в Program.cs — регистрация кодировок при каждом запросе является лишней работой; полное её отсутствие ломает документы с устаревшими кодовыми страницами.

Распределение нагрузки между узлами

Все вышеописанное настраивает рендеринг на одном узле по запросу. Когда один узел не может справиться с нагрузкой, следующий рычаг — не увеличение параметра, а публикация артефактов документа один раз в общую память и предоставление их каждому узлу. Это меняет модель затрат: рендеринг происходит один раз на документ вместо одного раза на сессию, а запросы страниц превращаются в чтение файлов. См. Распределённые развертывания.

Чеклист настройки

  1. Установите минимальное ImageResolution, приемлемое для вашего UX.
  2. Оставляйте CachePages включённым для интерактивного просмотра; отключайте для однопроходных или высококонкурентных сценариев.
  3. Явно закрывайте сессии; уменьшайте TimeOut, если использование прерывисто.
  4. Используйте LargeDoc + значение AutoLoad = false по умолчанию на клиенте для больших документов.
  5. Применяйте DefaultRender = false только когда нужен PDF с текстовым содержимым.

Была ли эта страница полезной?