Тонкая настройка производительности
Оптимизация рендеринга и памяти
Ресурсный профиль Doconut определяется тремя вещами: DPI рендеринга, что остаётся в кэше, и продолжительность сессий. Это руководство рассматривает рычаги в порядке их влияния.
Разрешение — самый мощный рычаг
ImageResolution (25–300 DPI) определяет как время рендеринга, так и размер изображения. Большинство форматов по умолчанию используют 200 DPI; изображения и PSD — 100.
// Предпросмотр списка документов не требует качества печати
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.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });На клиенте ViewerConfig.CacheEnabled = true предзагружает небольшое скользящее окно будущих изображений страниц в памяти браузера. Это кеш предзагрузки для конкретного просмотра, а не постоянный localStorage.
Сессии — память, которую вы не видите
Каждая открытая сессия хранит разобранную модель документа и (при включённом CachePages) её отрендеренные страницы, пока не истечёт скользящий TimeOut (по умолчанию 60 минут), с момента последнего запроса. Две привычки помогают держать это под контролем:
- Закрывайте то, чем закончили.
viewer.CloseDocument(token)освобождает движок сразу, а не ждёт окончания простоя. - Подбирайте правильный таймаут. Предпросмотр, который пользователи просматривают две минуты, не требует часовой сессии:
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 — регистрация кодировок при каждом запросе является лишней работой; полное её отсутствие ломает документы с устаревшими кодовыми страницами.
Распределение нагрузки между узлами
Все вышеописанное настраивает рендеринг на одном узле по запросу. Когда один узел не может справиться с нагрузкой, следующий рычаг — не увеличение параметра, а публикация артефактов документа один раз в общую память и предоставление их каждому узлу. Это меняет модель затрат: рендеринг происходит один раз на документ вместо одного раза на сессию, а запросы страниц превращаются в чтение файлов. См. Распределённые развертывания.
Чеклист настройки
- Установите минимальное
ImageResolution, приемлемое для вашего UX. - Оставляйте
CachePagesвключённым для интерактивного просмотра; отключайте для однопроходных или высококонкурентных сценариев. - Явно закрывайте сессии; уменьшайте
TimeOut, если использование прерывисто. - Используйте
LargeDoc+ значениеAutoLoad = falseпо умолчанию на клиенте для больших документов. - Применяйте
DefaultRender = falseтолько когда нужен PDF с текстовым содержимым.
Была ли эта страница полезной?