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

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

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

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

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

BaseConfig.CachePages (по умолчанию true) сохраняет каждую отрисованную страницу в памяти на протяжении всей сессии. Это правильное значение по умолчанию для интерактивного просмотра — пользователи прокручивают назад и вперёд. Отключайте его, когда:

  • документы огромные и просматриваются один раз от начала до конца,
  • много одновременных сессий умножат количество кешированных страниц,
  • вы предпочитаете тратить процессорное время на каждый просмотр, а не держать 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‑проекция с текстом.

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