Настройка производительности
Оптимизация рендеринга и памяти
Профиль ресурсов Doconut определяется тремя факторами: DPI рендеринга, что остаётся в кэше, и как долго живут сеансы. Это руководство рассматривает рычаги в порядке их влияния.
Разрешение — самый сильный рычаг
ImageResolution (25–300 DPI) определяет как время рендеринга, так и размер изображения. Для большинства форматов значение по умолчанию — 200 DPI; для изображений и PSD — 100.
// 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.
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‑проекция с текстом.
Была ли эта страница полезной?