Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

рендеринг кучи текста   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.058 c
1-1156488798
stone
2006-08-25 10:53
2006.10.08
Service


2-1158580517
Id
2006-09-18 15:55
2006.10.08
Картинка в BLOB-e


15-1158404835
Zeqfreed
2006-09-16 15:07
2006.10.08
Microsoft Document Explorer


3-1155037455
rsa_
2006-08-08 15:44
2006.10.08
проблема unicode в delphi>6 уже решена?


15-1158440180
Германн
2006-09-17 00:56
2006.10.08
Самопроизвольно перегружается компьютер WinXP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский