30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
|
1 | |
Алгоритмы отображения большого текста на экране20.08.2011, 15:17. Показов 1840. Ответов 15
Метки нет (Все метки)
Привет всем!
Может быть кто знает, есть какие-нибудь алгоритмы, позволяющие быстро отображать тексты больших размеров? Дело в том, что пишу читалку fb2, и там нужно выводить отпарсиный текст на экран (текст парсится в html формат). Тексты разные - например Л.Н. Толстой - Война и мир. Книга большая и если в лоб делать, то процесс отображения может занимать много времени. Уже намучился с этим, не знаю, что делать. Т.к. это книга - значит текст форматированный (кстати может содержать картинки), и алгоритм, вроде подсчета строк, которые могут уместиться на экран, вроде и не применишь. Подобные ридеры есть - например CoolReader. Отображает текст быстро. Но где там найти сей алгоритм - не знаю. Исходники смотрел - черт ногу сломит с их этим кодом... В общем, рассчитываю на вашу помощь. Ps если что, читалку делаю на Qt.
0
|
20.08.2011, 15:17 | |
Ответы с готовыми решениями:
15
Ускорение отображения большого DataGridView Ускорение отображения большого количества записей. Отображения на экране чисел от 10 до 0 Как создать матрицу для отображения на экране |
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
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
В общем, у тебя и выбора-то особо нет. Либо рисовать всё (медленно), либо вычислять высоту всего (ты не знаешь как) либо делать примерно.
0
|
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
|
20.08.2011, 19:07 [ТС] | 11 |
И тем не менее все читалки вычисляют точно. Даже если текст html. Вот как CoolReader делает? Как веб-браузеры делают? Как Word делает?
0
|
20.08.2011, 20:54 | 12 |
FBReader точно делает странично. Как и отписали выше.
за основу берется начало отображаемого текста (смещение от начала), вычисляется размер страницы (шрифт, междустрочный интервал), из имеющейся инфы вычисляется количество страниц, и размер/положение скроллера. Ничего мудреного.
0
|
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
|
21.08.2011, 00:11 [ТС] | 13 |
А как узнать, сколько слов уместится на одной линии?
0
|
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
|
21.08.2011, 00:24 [ТС] | 15 |
Текст у меня в конце концов получается html, поэтому в Qt использую QWebView.
Быть может, все вот это можно сделать непосредственно через html/css.
0
|
21.08.2011, 00:29 | 16 |
ну значит надо копать в сторону определения метрик шрифта в Qt. Думаю можно копать в QFont
Либо посмотреть свойства QWebView, возможно у нее есть виртуальный режим при котором контент не полностью сразу загружается, а по мере прокрутки.
0
|
21.08.2011, 00:29 | |
21.08.2011, 00:29 | |
Помогаю со студенческими работами здесь
16
Недостаточно ресурсов для отображения информации на экране пример использования MODI для отображения документа на экране Путь прохождения прерывания от нажатия клавиши до отображения на экране Вывод большого текста в value Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |