Средство визуализации Html с ограниченными ресурсами (хорошее управление памятью)

StackOverflow https://stackoverflow.com/questions/960089

  •  12-09-2019
  •  | 
  •  

Вопрос

Я создаю linux-программу на C ++ для портативного устройства для рендеринга html-файлов.

Проблема в том, что устройство ограничено в оперативной памяти, что делает невозможным открытие больших файлов (с помощью реального программного обеспечения).

Одним из решений является динамическая загрузка / выгрузка частей файла, но я не уверен, как это реализовать.

Возможность прокрутки обязательна, и, по возможности, она должна быть плавной

Я хотел бы услышать от вас , каков наилучший подход в такой ситуации?Вы можете предложить алгоритм, проект с открытым исходным кодом для ознакомления или библиотеку, поддерживающую то, что я пытаюсь сделать (webkit?).

Редактировать: Я пишу программу для чтения электронных книг, поэтому мне просто нужен чистый html-рендеринг, без javascript, без CSS...

Это было полезно?

Решение

Чтобы иметь возможность просматривать древовидный документ (например, HTML) без полной загрузки, вам придется сделать несколько предположений - например, что документ является реальным деревом.Так что не утруждайте себя проверкой закрывающих тегов.Закрывающие метки в любом случае предназначены для потребления человеком, компьютеры были бы довольны <> слишком.

Первый шаг - предположить, что первая часть вашего документа представлена первой частью вашего документа.Это звучит как тавтология, но с "современным" HTML и, конечно же, JS это технически уже не так.Тем не менее, если любая строка HTML может повлиять на любой пиксель, вы просто не сможете частично загрузить страницу.

Итак, если существует простая связь между положением HTML-файла и страниц на экране, следующим шагом будет определение состояния синтаксического анализа в конце каждой страницы.Затем это будет включать смещение одного файла, возможно (но не обязательно) в конце абзаца.Также частью этого состояния является стек открытых тегов.

Чтобы упростить подкачку, разумно сохранять это состояние "границы страницы" для каждой страницы, с которой вы сталкивались до сих пор.Это упрощает перелистывание назад.

Теперь, при рендеринге новой страницы, граничное состояние предыдущей страницы даст вам начальное состояние рендеринга.Вы просто читаете HTML и визуализируете его элемент за элементом, пока не переполните одну страницу.Затем вы немного возвращаетесь назад и определяете новое граничное состояние страницы.

Плавная прокрутка - это в основном рендеринг двух смежных страниц и отображение x% от первой и 100-x% от второй.После того, как вы внедрили эту часть, может оказаться разумным заканчивать абзац при рендеринге каждой страницы.Это даст вам немного другую длину страницы, но вам не придется иметь дело с разбитыми абзацами, а это, в свою очередь, немного уменьшит граничное состояние вашей страницы.

Другие советы

Дилло это самый легкий веб-браузер Linux, о котором я знаю.

Редактировать:Если он (или его компонент рендеринга) не соответствует вашим потребностям, вы можете найти список и сравнение их в Википедии. механизмы компоновки быть полезным.

Редактировать 2: Я подозреваю, что динамическая загрузка и выгрузка частей HTML-файла будет сложной задачей;например, как узнать, что случайно выбранный фрагмент файла не находится в середине тега?Вам, вероятно, придется использовать что-то вроде SAX для анализа файла в промежуточном представлении, сохраняя отдельные фрагменты промежуточного представления в постоянном хранилище, чтобы они не занимали слишком много оперативной памяти.Или вы можете проанализировать файл с помощью SAX, чтобы сразу показать все, что помещается в ОЗУ, а затем повторно проанализировать его всякий раз, когда пользователь прокручивает слишком далеко.(Таблицы стилей и Javascript разрушили бы этот подход;простой HTML тоже мог бы.) Если бы это был я, я бы попытался найти простой язык разметки или какое-нибудь средство просмотра форматированного текста, а не преодолевать все эти трудности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top