Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

Алгоритмы отображения большого текста на экране

20.08.2011, 15:17. Показов 1840. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!
Может быть кто знает, есть какие-нибудь алгоритмы, позволяющие быстро отображать тексты больших размеров?
Дело в том, что пишу читалку fb2, и там нужно выводить отпарсиный текст на экран (текст парсится в html формат). Тексты разные - например Л.Н. Толстой - Война и мир. Книга большая и если в лоб делать, то процесс отображения может занимать много времени. Уже намучился с этим, не знаю, что делать. Т.к. это книга - значит текст форматированный (кстати может содержать картинки), и алгоритм, вроде подсчета строк, которые могут уместиться на экран, вроде и не применишь.
Подобные ридеры есть - например CoolReader. Отображает текст быстро. Но где там найти сей алгоритм - не знаю. Исходники смотрел - черт ногу сломит с их этим кодом... В общем, рассчитываю на вашу помощь.

Ps если что, читалку делаю на Qt.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2011, 15:17
Ответы с готовыми решениями:

Ускорение отображения большого DataGridView
Есть приложение для формирования отчетов по документам. Информация о документах берется из базы...

Ускорение отображения большого количества записей.
Есть Grid подключенный к набору записей (ADODB.Recordset) содержащему большое кол-во записей (около...

Отображения на экране чисел от 10 до 0
Всем доброго времени суток. Суть простой задачи. Подскажите алгоритм работы программы....

Как создать матрицу для отображения на экране
Не могу понять как сделать класс аргументами которого являться матрица(список списков) ячеек и...

15
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
20.08.2011, 16:15 2
для обработки больших файлов существует технология маппинг файлов. но как я понимаю проблема не в объеме файла а в скорости его обработки т. к. формат fb2 является XML подобным форматом, поэтому попробуй подключить парсер XML типа SAX
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
20.08.2011, 16:22  [ТС] 3
Нет, не в объеме. Обычное художественное произведение весит от силы 1 МБ. Так сам парсер я написал, и работает он очень быстро, обработка файла - ежесекундно. А вот как все это вывести на экран? Вот проблема. Вот взять Антуан Де Сент-Экзюпери: Цитадель (~1,66МБ). Парсит, наверное, десяток миллисекунд, а выводит на экран ~3-4 секунды.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:29 4
Цитата Сообщение от [progeR
;1927200]а выводит на экран ~3-4 секунды.
А ты выводи не весь текст, а постранично (поэкранно).
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
20.08.2011, 16:43  [ТС] 5
Ну это понятно. А если хочу со скроллингом сделать? Чтобы прокрутить можно было любой кусок.
Например FireFox тоже умеет читать эти книги. И там сделано с прокруткой. И выводится все тоже очень быстро.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:49 6
Потому что выводится постранично. Не стоит думать, что в ридерах рисуется сразу весь текст, а потом прокручивается. Это не так. Скролер лишь указывает, какую часть текста показать.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
20.08.2011, 17:02  [ТС] 7
Тогда для скролбара нужно как рассчитать максимальное значение. В случае обычного текста сделать не сложно. А как для текста в html?
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 17:16 8
Выполнить такой же обход дерева, как и при отрисовке, но не выполняя её, а только вычисляя размер. Хотя, в том же вконтакте, например, высота не вычисляется и скроллбар масштабируется в процессе прокрутки, т.е. если конец текста не достигнут и нужно отмотать, то к известной величине добавляется ещё чуток высоты следующего блока текста.
Но ведь в формате fb2 количество страниц известно? Тогда проблемы не должно быть.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
20.08.2011, 17:31  [ТС] 9
Нет, не известно кол-во страниц. И это количество зависит от используемого шрифта, его размера, наличия картинок. А масштабируемый скролбар - не вариант, так никто не делает.

А про обход дерева - это хорошо, вот только в Qt ничего подобного не видел. Это все скрыто в том самом методе, который выводит html текст на экран...
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 18:55 10
Цитата Сообщение от [progeR
;1927339]А масштабируемый скролбар - не вариант, так никто не делает.
ВинДежавю так делает. Высота скроллбара уточняется в процессе...
В общем, у тебя и выбора-то особо нет. Либо рисовать всё (медленно), либо вычислять высоту всего (ты не знаешь как) либо делать примерно.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
20.08.2011, 19:07  [ТС] 11
И тем не менее все читалки вычисляют точно. Даже если текст html. Вот как CoolReader делает? Как веб-браузеры делают? Как Word делает?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
20.08.2011, 20:54 12
FBReader точно делает странично. Как и отписали выше.
за основу берется начало отображаемого текста (смещение от начала), вычисляется размер страницы (шрифт, междустрочный интервал), из имеющейся инфы вычисляется количество страниц, и размер/положение скроллера. Ничего мудреного.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
21.08.2011, 00:11  [ТС] 13
А как узнать, сколько слов уместится на одной линии?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 00:13 14
а что используется в качестве "рисовалки" текста?
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
21.08.2011, 00:24  [ТС] 15
Текст у меня в конце концов получается html, поэтому в Qt использую QWebView.
Быть может, все вот это можно сделать непосредственно через html/css.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 00:29 16
ну значит надо копать в сторону определения метрик шрифта в Qt. Думаю можно копать в QFont

Либо посмотреть свойства QWebView, возможно у нее есть виртуальный режим при котором контент не полностью сразу загружается, а по мере прокрутки.
0
21.08.2011, 00:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2011, 00:29
Помогаю со студенческими работами здесь

Недостаточно ресурсов для отображения информации на экране
вот он: Sub ColorSelect(cel As Range) Dim CrIndex As Byte With cel If .Value > 50 Then ...

пример использования MODI для отображения документа на экране
Господа, поделитесь, пожалуйста, примером использования MODI для отображения документа на экране. ...

Путь прохождения прерывания от нажатия клавиши до отображения на экране
Всем привет. Сижу читаю статьи про прерывания, так для общего просвещения. Так основные принципы...

Вывод большого текста в value
Добрый день, нужно вывести большой объем текста. Например такого содержания: Эйнштейн - автор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru