Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.053 c
8-1141039800
Новенький
2006-02-27 14:30
2006.10.08
Audio Capture


2-1158659877
Officeman
2006-09-19 13:57
2006.10.08
Странная ошибка в ListView1.Selected


15-1158673674
DillerXX
2006-09-19 17:47
2006.10.08
Возможно ли найти что-то новое?


2-1158521523
Aleksandr
2006-09-17 23:32
2006.10.08
Delphi7 и html


15-1158316984
Тульский
2006-09-15 14:43
2006.10.08
Visual Prolog