Текущий архив: 2006.10.08;
Скачать: CL | DM;
Внизрендеринг кучи текста Найти похожие ветки
← →
tButton © (2006-08-24 10:08) [0]есть много-много текста с форматированием а-ля ХТМЛ
разобрать его для меня не проблема. проблема быстро его отрендерить
сейчас набросал вариант с использованием банального TextOut
и в принципе он подходит когда строк <100
(каждая рендерится сама по себе)
можно, конечно реализовать иначе (через попиксельный вывод. есть чем вывести со скоростью >2Mpx/s), но
помнится мне что я и прежде (года два-три) назад сталкивался с подобной проблемой
и мне здесь наглядно объяснили, что вся беда в том что каждый раз DC блокируется/разблокируется, на что и тратится уйма времени.
в итоге показали мне решение проблемы через АПИшные хитрости
к сожалению, за давностью лет решение протерялось
хотелось бы найти его снова =)
PS
как-то же memo выводит уйму текста без тормозов?
← →
Ketmar © (2006-08-24 10:26) [1]DrawTextEx()?
← →
Fay © (2006-08-24 12:50) [2]2 афтар
Поменяй ник
← →
Ketmar © (2006-08-24 13:00) [3]ктстати, мой рендерер для клиента чата вообще выводил посимвольно. и ничего, не тормозил. %-)
← →
Fay © (2006-08-24 13:14) [4]На самом деле, было бы интересно посмотреть на код, который тормозит...
А вот "через попиксельный вывод"... Даже завидно... Вот бы и меня так вставило...
← →
DiamondShark © (2006-08-24 16:36) [5]
> и в принципе он подходит когда строк <100
А на экран больше и не помещается.
← →
TButton © (2006-08-24 17:58) [6]
> На самом деле, было бы интересно посмотреть на код, который
> тормозит...
ну напиши код который TextOut"ом будет выводить ~1000 строк на битмап
> А вот "через попиксельный вывод"... Даже завидно... Вот
> бы и меня так вставило...
ну вот люблю я пиксели =)
и они отвечают мне взаимностью =)
← →
Fay © (2006-08-24 18:18) [7]2 TButton © (24.08.06 17:58) [6]
Так это наш старй добрый TButton?! Не признал. в "Интересное о себе" раньше было другое...
> выводить ~1000 строк
А чё не 10000000000 ?
← →
Fay © (2006-08-24 18:30) [8]Вывел DrawText-ом. Всё ОК.
← →
Ketmar © (2006-08-24 19:56) [9]> [6] TButton © (24.08.06 17:58)
тысяча строк... это кеглем 1, что ли? так тогда просто линии можно рисовать, один фиг никто не отличит.
← →
Fay © (2006-08-24 20:02) [10]Ketmar © (24.08.06 19:56) [9]
Я их вывел с шагом 1 по высоте 8)
← →
Ketmar © (2006-08-24 20:30) [11]> [10] Fay © (24.08.06 20:02)
говорят, что если делать шаг 0, можно в одну строку всю БСЭ вывести! %-)
← →
Fay © (2006-08-24 20:38) [12]2 Ketmar © (24.08.06 20:30) [11]
> говорят, что если делать шаг 0, можно в одну строку всю БСЭ вывести!
Только при нулевой или очень-очень маленькой толщине строк
← →
Ketmar © (2006-08-24 20:41) [13]> [12] Fay © (24.08.06 20:38)
мда. не учёл. а я-то думал, почему у меня не получалось...
← →
tButton © (2006-08-24 22:36) [14]хм. цикл пробегает по логу и выводит каждую строку на битмап
на каждом шаге цикла битмап увеличивается на высоту строки.
вопросы?
← →
Fay © (2006-08-24 22:37) [15]tButton © (24.08.06 22:36) [14]
Вопросы есть. Один вопрос.
> битмап увеличивается на высоту строки
НАЖУЯ?
← →
Ketmar © (2006-08-24 22:39) [16]> [14] tButton © (24.08.06 22:36)
почему не похмеляешься? %-)
← →
tButton © (2006-08-24 22:48) [17]
> в "Интересное о себе" раньше было другое...
раньше там был сорц =)
потом его удалили =)
> Ketmar © (24.08.06 10:26) [1]
> DrawTextEx()?
читаю. проникаюсь.
> Fay © (24.08.06 22:37) [15]
> tButton © (24.08.06 22:36) [14]
> Вопросы есть. Один вопрос.
я предвкушал этот вопрос =)
знаю. технология бредовая в корне. но почему-то тогда я сделал это именно так.
суть в том чтоб отрендерить текст на битмап и вывести нужный кусок битмапа
ширина битмапа может варьироваться.
строки переносятся
из-за этого может варьироваться и высота.
можно. конечно определять её заранее
(чё-т я раньше об этом не подумал)
но реализовал я это именно вот так
через задницу
ну, положим, я предварительно рассчитаю высоту и буду выводить текст посимвольно. сколько я смогу вывести за незамтеное глазу время?
или всё-таки стоит углубиться и выводить только видимый текст?
← →
tButton © (2006-08-24 22:50) [18]
> Ketmar © (24.08.06 22:39) [16]
шесть утра =) идти куда-то ломает =)
завтра на ра... сегодня на работу а я ещё глаз не сомкнул =)
← →
Fay © (2006-08-24 22:54) [19]DT_CALCRECT не ку?
← →
Fay © (2006-08-24 22:55) [20]> или всё-таки стоит углубиться и выводить только видимый текст?
Совершенно верно.
← →
Fay © (2006-08-24 22:55) [21]Битмапы не резиновые
← →
tButton © (2006-08-24 22:59) [22]In either case, DrawTextEx returns the height of the formatted text, but does not draw the text.
т.е. пройтись по тексту с DT_CALCREC
просуммировать.
и тут меня заступорило
но в принципе разобраться можно
надо только кое-что поменять
← →
Fay © (2006-08-24 23:03) [23]tButton © (24.08.06 22:59) [22]
Блин... Всё то же самое, только без увеличения битмапа!
8)
← →
Ketmar © (2006-08-24 23:09) [24]> [22] tButton © (24.08.06 22:59)
а что там разбираться? возвратят тебе в rect"е размеры, и всё.
← →
tButton © (2006-08-24 23:20) [25]ну хз. просто сейчас скроллинг попиксельный
как мнимум - придёт переделать в построчный
причём если строка разбивается на две и более
то скроллить нужно будет всё равно только на одну
разбираться надо в определении с какой строки по какую рендерить
← →
Fay © (2006-08-24 23:24) [26]2 tButton © (24.08.06 23:20) [25]
Идеальнай случай : фонт один, непропорциональный и одним кеглем! (как в IDE Delphi)
У тебя не так?...
← →
Ketmar © (2006-08-24 23:27) [27]совершенно не помню, умеет ли DrawTextEx() вставлять в нужные места переносы при вычислении размера. и проверять лень. как вариант -- делать скроллинг таки построчно. строки с переносом будут просто выше остальных, их можно начинать рисовать с отрицательным y.
опять же, DrawTextEx() никак не мешает делать попиксельный скроллинг.
слушай, выспись, а? гарантирую, после хорошего сна многое прояснится. проверено на личном опыте. %-)
← →
Ketmar © (2006-08-24 23:27) [28]"построчно" -- это значит "сдвигать строго на высоту символа".
← →
Ketmar © (2006-08-24 23:28) [29]ещё полезно делать "кэш размеров", чтобы не перевычислять каждый раз размеры для строк, которые не изменились. но до этого, думаю, и сам догадаешься. %-)
← →
Fay © (2006-08-24 23:29) [30]2 Ketmar © (24.08.06 23:27) [27]
> слушай, выспись, а
Повежливей. Мы все очень любим и уважаем товарища TButton. 8)
← →
Ketmar © (2006-08-24 23:31) [31]> [30] Fay © (24.08.06 23:29)
так я же не с издёвкой это советую. я вполне серьёзно.
← →
tButton © (2006-08-24 23:50) [32]я счас заплачу =)
и усну =)
а теперь серьёзно.
DrawTextEx() умеет вставлять переносы для этого есть DT_WORDBREAK
но вставляет он их при выводе
допустим первая строка у меня разбивается на три (при выводе) остальные идут по одной
я скроллю вниз на строку и вывожу со второй
но по факту я скроллю вниз на три
вот в чём заморочка
вот... пойду-ка я пожалуй действительно кимарну пару часиков =)
← →
Ketmar © (2006-08-24 23:55) [33]> [32] tButton © (24.08.06 23:50)
я имел в виду -- умеет ли можифицировать строку до вывода. %-)
скролишь ты не только по строкам, но и по координатам. %-)
смотри: высота символа -- 8 пикселей.
начинаем со строки 0, y=0. высота строки 0 -- 24 пиксела (потому что её побило %-).
при скролле ставим: y=-8. проверяем, не ушла ли строка 0 полностью за экран. не ушла, очевидно. выводи всё опять, но уже с y=8.
повторяем, пока y не станет -24. после чего ясно, что строка 0 полностью уехала. делаем y := 0; и Inc(topLine).
повторяем всё с самого начала.
натурально, y можно менять и на 1 -- получишь попиксельный скроллинг. на алгоритм это не влияет.
← →
Ketmar © (2006-08-24 23:56) [34]сорри, с "y=-8".
← →
tButton © (2006-08-25 07:18) [35]а я вот пока надумал
делать параллельный лог уже с переносами
т.е. поскольку кегль и гарнитура шрифта не меняются
то можно сделать массивчик с шириной каждого символа и при таких событиях как изменение ширины (шрифта) или добавление строчки соответственно пересчитывать или обновлять лог с перенесёнными словами.
высота строки постоянная и зависит от размера шрифта
её можно запомнить однажды и затем в любой момент можно посчитать общую высоту перемножив высоту строки на количество строке в логе с переносами
таким же образом можно легко выявить строки для отрисовки.
← →
Ketmar © (2006-08-25 09:50) [36]> [35] tButton © (25.08.06 07:18)
нет. всё-таки не выспался. %-)
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.037 c