Аннотация
Медленное перелистывание, лишняя пустая страница и след предыдущего изображения похожи на проблемы одной читалки, но возникают на разных уровнях. EPUB описывает публикацию и требования к читающей системе; crengine интерпретирует её содержимое и строит раскладку; экранный драйвер и физическая панель решают, как получившиеся пиксели превращаются в изображение. Настройка одного уровня не обязательно исправит другой.
В обзоре на данных на 30 октября 2026 года сопоставлены рекомендации W3C, исходники и руководство KOReader, отчёты об ошибках, документация производителя дисплейного модуля и исследования электрофоретических экранов. Рассматривается KOReader v2026.07.1 и связанный с ним crengine; изменяемое руководство описывается отдельно. Практический вывод: диагностировать нужно по этапам, а не по одному впечатлению от скорости. Собственных замеров устройств и испытаний совместимости EPUB в этом обзоре нет.123
Введение
Удобство чтения зависит одновременно от структуры книги, выбора шрифта, размеров страницы, особенностей реализации CSS и поведения экрана. При этом одна и та же книга может менять количество видимых страниц при изменении размера текста, а изображение предыдущей страницы может оставаться заметным после успешной программной перерисовки. Смешивание этих явлений ведёт к неверному ремонту: например, принудительное обновление панели не перепишет ошибочное разбиение текста на страницы.12
Цель обзора — объяснить путь от файла до экрана и предложить воспроизводимую последовательность диагностики. В границы входят EPUB с перетекающим текстом, отдельно — оговорки о fixed layout, crengine в KOReader, особенности Android и обновления электрофоретических панелей. Это не тест всех реализаций EPUB 3, не сравнение моделей ридеров и не инструкция по обходу DRM. Версия кода и актуальность онлайн-руководства — разные вопросы: поведение конкретной сборки следует проверять на ней самой.43
1. Что определяет EPUB, а что остаётся читалке
EPUB — контейнер публикации, а не набор готовых экранных страниц. Package document содержит метаданные, manifest ресурсов и spine — последовательность документов для чтения. Само содержание обычно представлено XHTML или SVG, которые могут ссылаться на стили, изображения и другие ресурсы. Стандарт описывает и организацию публикации, и требования к содержимому, но само наличие CSS ещё не доказывает, что каждый движок воспроизводит его одинаково.1
Различие режимов принципиально. Для reflowable спецификация говорит: «The content is not pre-paginated», а динамическую пагинацию применяет читающая система. Для pre-paginated содержимое заранее разбито на страницы. Поэтому смена размера шрифта, полей или ориентации в перетекающем тексте может изменить количество экранных страниц; номер отображаемой страницы не обязан совпадать с печатной страницей книги.12
Читающая система также имеет собственный стандарт соответствия — EPUB Reading Systems 3.3. Он прямо указывает: «This specification does not require EPUB reading systems to support scripting, form submission, or the HTML DOM». Отсутствие JavaScript само по себе, следовательно, не доказывает несоответствие этой спецификации. Обратное тоже неверно: общее соответствие формату нельзя вывести из того, что файл открылся и текст виден.4
CSS Fragmentation описывает разрывы и ограничения, связанные с разбиением содержимого на фрагменты, включая widows и orphans. Это модель правил, а не обещание, что конкретный движок поддерживает каждое свойство и каждую комбинацию. Проверка причин пустого места должна начинаться с документа и применённых стилей, но завершаться наблюдением в конкретной версии читалки; из текста стандарта нельзя вычислить фактическую раскладку crengine без проверки реализации.56
Отдельная проблема — адресация. Руководство KOReader различает экранные страницы и reference page numbers, если издатель включил номера печатного издания. В запросе функции логических страниц разработчику важно, чтобы ссылки не менялись после настройки верстки; это запрос, а не доказательство того, что предложенный алгоритм уже реализован. Для цитирования устойчивее использовать предоставленные издателем привязки или другие поддерживаемые идентификаторы, чем предполагать универсальность текущего номера экрана.27
2. Что делает crengine и где появляется стоимость
В исследуемом релизе KOReader используется связка с исходным кодом crengine, зафиксированным коммитом b32a88ffbbf505cf2ea5208c1a49002d70d3609f: тег релиза указывает на подмодуль base, а тот — на этот коммит crengine.89 В файле импорта видны работа с контейнером, поиск package document, обработка элементов spine и ресурсов. Это конкретная реализация чтения EPUB, а не нормативное определение формата. Наличие функции в исходнике показывает предусмотренный кодовый путь, но не гарантирует корректность всех книг и комбинаций разметки.10
После разбора ресурсов нужно применить стили, подобрать шрифты и построить размещение содержимого. На этом этапе настройки пользователя взаимодействуют с оформлением издателя. В обсуждении epub.css участник проекта описывает конфликт исторических базовых стилей с ожиданиями издательских CSS, рассчитанных на обычную браузерную базу; в качестве примеров названы разрывы перед заголовками и центрирование. Это объяснение конкретной проблемы каскада, а не доказательство, что такие правила действуют без изменений во всех последующих версиях.6
Сложность CSS способна влиять на время до появления страницы независимо от экрана. В issue crengine разработчик указывает, что при большом количестве class selectors и узлов вызывается множество проверок соответствия, и предлагает оптимизации. Это аргумент о потенциальной стоимости рассматриваемого участка кода, а не опубликованный бенчмарк всей читалки; статус конкретной оптимизации в исследуемой сборке из одного сообщения не следует.11
Руководство предлагает диагностический эксперимент: временно отключить Embedded Styles и посмотреть, изменится ли ситуация. Если документ становится удобнее или быстрее, это свидетельство в пользу исследования его CSS, но не доказательство одной конкретной ошибки: одновременно может исчезнуть нужное оформление. Сравнивать надо одну и ту же книгу на одном устройстве, оставив остальные параметры неизменными, а затем вернуть стили и точечно использовать Style Tweaks или исправить сам EPUB.2
Структура книги имеет значение и при повторной компоновке. Руководство сообщает, что частичный рендеринг возможен для EPUB из нескольких фрагментов; для книги, состоящей из одного HTML-файла, при изменениях приходится рассчитывать весь документ. Его описание относится к поведению и механизму KOReader, а не к требованию EPUB разбивать книгу по главам. Разбиение на осмысленные XHTML-файлы — возможный приём подготовки книги, но оно не устраняет автоматически сложные стили или другие причины задержки.2
Кэш и повторное использование ранее рассчитанных данных могут менять наблюдаемую задержку при повторном открытии. Поэтому холодное открытие после сброса или отсутствия кэша и повторное открытие нельзя считать одной операцией. Без измерений для выбранных сборки и устройства нельзя утверждать, сколько времени занимает каждая стадия или что именно кэш сохраняет во всех конфигурациях. Пользовательский отчёт о загрузке примерно за десять секунд относится к одному EPUB и устройству и сопровождается сообщением о периодическом обрезании текста; это полезный сценарий воспроизведения, а не типичное значение для KOReader.12
Зашифрованные ресурсы требуют отдельной проверки. Код импорта выводит предупреждение EPUB contains unsupported encrypted items (DRM), но не останавливается немедленно: комментарий поясняет, что неподдерживаемым может оказаться только шрифт, тогда как текст ещё читаем. Из этого не следует поддержка произвольной DRM-схемы. Если текст или шрифты отсутствуют, следует прежде проверить права доступа и доступность совместимой незашифрованной версии книги, а не считать проблему дефектом панели.10
3. Пиксели в памяти и частицы в панели
Готовый bitmap и физически обновлённый экран — разные результаты. Документ KOReader о портировании описывает для устройств mxcfb Linux framebuffer и последующее отображение через device-specific ioctls, с попыткой использовать доступные режимы waveform, аппаратный dithering и инверсию. Это описание определённого семейства Linux-устройств, а не универсальный контракт для Android или каждой электронной книги.13
В электрофоретическом дисплее заряженные частицы перемещаются в жидкости под действием электрического поля. Waveform — последовательность управляющих воздействий, а не просто указание нового цвета пикселя. Исследование оптической структуры Kindle Paperwhite непосредственно наблюдало движение пигмента при переходе между чёрным и белым; оно относится к исследованному устройству, а не измеряет скорость всех современных панелей.1415
Работа о проектировании waveform описывает стадии стирания прежнего изображения, активации частиц и формирования нового. Авторы связывают выбор последовательности как со скоростью отклика, так и с видимостью остаточного изображения. Это физическая причина, почему смена содержимого буфера не обязана мгновенно стереть след предыдущего экрана. Конкретная последовательность, её длительность и доступные приложению режимы зависят от панели, контроллера и программного стека.16
Слова «полное» и «частичное» легко смешивают две разные оси: площадь обновляемой области и используемый режим управления панелью. Обновление всего экрана не обязательно означает один и тот же waveform на всех устройствах; небольшая область тоже может иметь собственные ограничения. По одному названию пункта меню или по наличию мигания нельзя надёжно восстановить управляющую последовательность. Руководство KOReader описывает полное обновление страниц с изображениями как способ убрать остатки и ghosting, но прямо допускает изменение настройки по устройству и предпочтениям.213
След от предыдущей страницы — не то же самое, что неверная верстка. Если контур старого изображения остаётся поверх нового, стоит исследовать refresh; если строка обрезается одинаково после повторного полного обновления, более вероятен путь документа, компоновки или растеризации. Это диагностические гипотезы, а не строгий тест: дефекты драйвера и панели тоже могут проявляться неоднозначно. Сравнение снимков одной страницы до и после ручного обновления помогает разделить гипотезы, но не заменяет инструментального измерения.216
Не существует универсального числа быстрых перелистываний между полными обновлениями. Waveshare для конкретного 1.54-дюймового модуля предупреждает против бесконечного использования partial refresh и советует периодическое полное обновление; тот же документ содержит рекомендации по питанию именно этого модуля. Применять его интервалы и предупреждения к любой коммерческой читалке без документации устройства нельзя. Исследование трёхцветного BWR-дисплея рассматривает ghosting между чёрным и красным и другую waveform; переносить результаты на монохромные панели напрямую также нельзя.1715
Бистабильность панели помогает сохранять изображение без непрерывной перерисовки, но не означает нулевого энергопотребления всей читалки. Процессор, подсветка, беспроводные интерфейсы, контроллер и обновления — разные потребители. Исследования waveform оценивают отдельные конструкции и режимы, поэтому без сопоставимого измерения устройства нельзя обещать конкретный выигрыш автономности от отключения мигания.1615
4. Android: совместимый EPUB не гарантирует доступ к панели
На Android KOReader работает внутри ограничений приложения, версии ОС и реализации производителя. Наличие электрофоретического экрана не означает, что стороннему приложению доступны те же интерфейсы, что встроенной читалке. В частности, Linux mxcfb-путь из документа о портировании нельзя автоматически приписывать Android-сборке; поддерживаемые режимы и поведение refresh необходимо проверять по конкретной модели, прошивке и сборке.13
Wiki проекта описывает установку через F-Droid или APK и рекомендует выбирать пакет по архитектуре. Это изменяемая документация проекта, а не гарантия, что конкретная прошивка позволит установить APK или предоставит приложению нужные разрешения и аппаратные режимы. Для диагностики полезно записать модель, версию Android, прошивку, архитектуру APK и источник установки; обновление приложения и обновление прошивки следует рассматривать как отдельные изменения.18
На практике полезно сравнить встроенную читалку и KOReader на одном файле, одной ориентации и примерно сопоставимом размере текста. Различие может возникнуть из-за движка, стилей или политики дисплея, поэтому тест только подтверждает различие конечного поведения, но сам по себе не определяет причину. Если одинаковая страница отличается до и после ручного обновления, внимание стоит направить на экранный путь; если меняется расположение строк, сначала — на верстку и настройки.213
5. Практический протокол: отделяем причины
Сначала зафиксируйте исходные условия. Сохраните копию EPUB, отметьте версию KOReader, модель, прошивку, ориентацию и параметры шрифта. Выберите небольшой обычный текстовый фрагмент, страницу с изображением и страницу с проблемой. Если наблюдение зависит от первого открытия, отдельно фиксируйте повторное открытие и не называйте его холодным запуском без контроля состояния кэша. Такой протокол не требует предполагать, что чужая задержка повторится у вас.212
Затем проверяйте документ. Сравните ту же книгу с другим EPUB и временно выключите Embedded Styles. Если результат изменился, проверьте оформление и структуру книги: влияние могут оказывать как стили издателя, так и их взаимодействие с базовыми стилями движка. Отключение всех стилей — способ локализации, а не универсальное постоянное решение: смысловые отступы, выделения и оформление при этом могут исчезнуть.26
Для проблем пагинации меняйте по одному параметру. Верните исходное оформление, затем отдельно изменяйте размер шрифта, поля и ориентацию, фиксируя страницу и результат. В перетекаемом тексте изменение границ страницы ожидаемо; обрезание содержимого или пропавшая иллюстрация заслуживает отдельного воспроизводимого примера. Отчёт об автоматическом уменьшении изображений в KOReader 2025.08 показывает возможное расхождение ожиданий автора CSS и поведения читалки, но не доказывает аналогичное поведение релиза 2026.07.1.119
Для ghosting сравнивайте экранные режимы отдельно от верстки. Сначала вручную обновите проблемную страницу, затем попробуйте доступные настройки частоты и поведения обновлений, включая обработку страниц с изображениями. Цель — найти приемлемый компромисс между остаточными следами и видимым миганием на данной модели. Не переносите частоту обновления из документации отдельного модуля на читалку как техническую норму.215
Если готовите отчёт об ошибке, приложите минимальный легально распространяемый EPUB или точные шаги воспроизведения, идентификаторы версий, настройки и результаты сравнения. Укажите, проблема видна до или после ручного обновления и появляется ли после повторного открытия. Снимок экрана показывает программное изображение, тогда как фотография панели способна показать физический ghosting; ни один из этих артефактов по отдельности не измеряет задержку или потребление энергии.1316
Дискуссионные вопросы и противоречия
«Это EPUB, значит должно выглядеть как в браузере». Позиция издателя может опираться на веб-технологии и CSS; автор issue о epub.css действительно описывает столкновение с ожиданием браузерной базы. Но стандарт читающих систем не требует полной эквивалентности браузеру, в частности поддержки scripting и DOM. Противоречие объясняется разными слоями требований и настройками движка, а не тем, что EPUB обязательно является пиксельно фиксированным документом.46
«Частичное обновление всегда лучше» против «нужно всегда полное». Быстрая смена может уменьшить заметность мигания, но производитель конкретного модуля предупреждает о последствиях постоянного partial refresh; руководство KOReader оставляет часть поведения на усмотрение пользователя. Разница связана с панелью, способом управления, типом страницы и допуском пользователя к остаточному изображению. Ни один из источников не устанавливает оптимальный режим для всех устройств.215
«Медленно из-за E Ink» против «медленно из-за EPUB». Разработчик crengine указывает на потенциально дорогую обработку селекторов, тогда как исследование дисплея описывает физическую длительность waveform. Обе причины правдоподобны, но относятся к разным стадиям; сумма задержек и доля каждой не известны без профилирования. Субъективное наблюдение полного перелистывания не позволяет честно выбрать виновника.1116
Недостаточность данных
В доступных документах и исходниках не найдены сопоставимые независимые измерения именно релиза v2026.07.1 для набора одинаковых EPUB, разных Android E Ink-моделей и контролируемых режимов refresh. Поэтому обзор не утверждает ни типичной задержки перелистывания, ни выигрыша кэша, ни конкретного расхода батареи. Пользовательские issue полезны для гипотез, но не являются репрезентативной выборкой.1219
Также не установлена полная матрица поддержки EPUB 3 и CSS для указанной сборки и всех сочетаний свойств. Открытый исходник импорта подтверждает отдельные механизмы, а стандарт — требования к соответствующим категориям систем; ни тот ни другой без тестового набора не подтверждает полную совместимость. Аналогично режимы конкретных Android-прошивок и связь их названий с реальными waveform остаются вопросом для документации производителя и эксперимента.41310
Заключение
Для перетекаемого EPUB страницы создаются читающей системой, а не хранятся в книге как неизменная сетка. crengine добавляет конкретную реализацию импорта, стилей и компоновки; её поведение может отличаться от ожиданий автора документа. Наконец, драйвер и физическая панель определяют, когда и насколько чисто отобразится результат. Это три независимые области диагностики, хотя пользователь воспринимает их как одно перелистывание.11310
Практическая последовательность — сохранить воспроизводимый пример, изолировать влияние оформления и параметров, затем отдельно проверить ручное и автоматическое обновление экрана. Для Android необходимо проверять модель и прошивку, а не переносить предположения с Linux mxcfb. Лучшее следующее исследование — измерить на фиксированных книгах холодное открытие, повторное открытие и физический переход страницы, одновременно записывая настройки и метод измерения; до этого сравнительные цифры останутся предположением.
Quality Metrics
Учтённый корпус ниже — 19 конкретных документов, для которых открыты релевантные фрагменты и которые используются в статье. Это проверенный минимум, а не утверждение о полном количестве найденных или прочитанных материалов в поиске коллег: полный журнал кандидатов не сохранил достоверного общего счёта. Виды источников относятся к цитируемому корпусу; руководства и репозитории отнесены к официальной документации, issue — к обсуждениям.
| Metric | Value |
|---|---|
| Sources found | 19 |
| Sources read | 19 |
| Sources cited | 19 |
| Academic sources | 3 |
| Official/documentation | 11 |
| Industry reports | 0 |
| News/journalism | 0 |
| Blog/forum | 5 |
| Citation coverage | 92% |
| Counter-arguments searched | Yes |
| Research rounds | 2 |
| Questions emerged | 3 |
| Questions resolved | 0 |
| Questions insufficient data | 3 |
W3C. “EPUB 3.3.” W3C Recommendation, редакция 2026. https://www.w3.org/TR/2026/REC-epub-33-20260113/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
KOReader. “KOReader User Guide.” Документация проекта, дата обращения: 2026-10-30. https://koreader.rocks/user_guide/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
KOReader. “KOReader 2026.07.1.” Примечания к выпуску, дата обращения: 2026-10-30. https://github.com/koreader/koreader/releases/tag/v2026.07.1 ↩︎ ↩︎
W3C. “EPUB Reading Systems 3.3.” W3C Recommendation, редакция 2024. https://www.w3.org/TR/2024/REC-epub-rs-33-20241017/ ↩︎ ↩︎ ↩︎ ↩︎
W3C. “CSS Fragmentation Module Level 3.” W3C, Candidate Recommendation. https://www.w3.org/TR/css-break-3/ ↩︎
crengine contributors. “epub.css: update to play better with publishers EPUBs?” GitHub issue 294, дата обращения: 2026-10-30. https://github.com/koreader/crengine/issues/294 ↩︎ ↩︎ ↩︎ ↩︎
KOReader contributors. “FR: Logical Page count for crengine formats.” GitHub issue 9020, дата обращения: 2026-10-30. https://github.com/koreader/koreader/issues/9020 ↩︎
KOReader. “base”, запись подмодуля в релизе v2026.07.1. GitHub API, дата обращения: 2026-10-30. https://api.github.com/repos/koreader/koreader/contents/base?ref=v2026.07.1 ↩︎
KOReader. “crengine”, запись подмодуля в koreader-base. GitHub API, дата обращения: 2026-10-30. https://api.github.com/repos/koreader/koreader-base/contents/thirdparty/kpvcrlib/crengine?ref=6e4bc81af4e04f78d81677a323a780a71b29702a ↩︎
crengine contributors. “epubfmt.cpp.” Исходный код, commit b32a88ffbbf505cf2ea5208c1a49002d70d3609f. https://github.com/koreader/crengine/blob/b32a88ffbbf505cf2ea5208c1a49002d70d3609f/crengine/src/epubfmt.cpp ↩︎ ↩︎ ↩︎ ↩︎
crengine contributors. “Inefficiency in applying stylesheet.” GitHub issue 529, дата обращения: 2026-10-30. https://github.com/koreader/crengine/issues/529 ↩︎ ↩︎
KOReader contributors. “Slow loading of EPUB when switching from landscape-oriented book.” GitHub issue 14442, дата обращения: 2026-10-30. https://github.com/koreader/koreader/issues/14442 ↩︎ ↩︎ ↩︎
KOReader. “Porting.” Документация проекта, дата обращения: 2026-10-30. https://koreader.rocks/doc/topics/Porting.md.html ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Bart Johnson et al. “Optical teardown of a Kindle Paperwhite display by OCT.” arXiv, 2015. https://arxiv.org/abs/1605.05174v1 ↩︎
Waveshare. “1.54inch e-Paper Module Manual.” Документация производителя, дата обращения: 2026-10-30. https://www.waveshare.com/wiki/1.54inch_e-Paper_Module_Manual ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
“Driving Waveform Design of Electrophoretic Display Based on Optimized Particle Activation for a Rapid Response Speed.” Micromachines, 2020. https://www.mdpi.com/2072-666x/11/5/498 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
“A New Waveform to Solve the Ghosting of BWR EPD.” PubMed Central, дата обращения: 2026-10-30. https://pmc.ncbi.nlm.nih.gov/articles/PMC12029558/ ↩︎
KOReader. “Installation on Android devices.” Wiki проекта, дата обращения: 2026-10-30. https://raw.githubusercontent.com/wiki/koreader/koreader/Installation-on-Android-devices.md ↩︎
KOReader contributors. “Auto shrinking images: margins and pagebreaks.” GitHub issue 14500, дата обращения: 2026-10-30. https://github.com/koreader/koreader/issues/14500 ↩︎ ↩︎