Как ускорить вывод на экран?
От: Сергей  
Дата: 25.12.01 15:31
Оценка:
Привет народ!
Вот сталкнулся с такой проблемой: в приложении doc/view я в классе документа создаю таблицу примерно 60*400 ячеек, каждая 50*15 пикселей, инициализирую каждую ячейку, задавая её положение на экране, цвет, размер шрифта и т.д. Вывод на экран в OnDraw представления — в цикле перебираю все ячейки и рисую по имеющимся в каждой из них данным. Но когда прокручиваю содержимое представления перерисовка происходит отвратительно медленно, хотя перерисовываю только те ячейки, который попадают в область перерисовки.
Что делать ума не приложу, помогите пожалуйста кто может.
Re: Как ускорить вывод на экран?
От: Igor Soukhov  
Дата: 25.12.01 17:47
Оценка:
Здравствуйте Сергей, Вы писали:

С>Привет народ!

С>Вот сталкнулся с такой проблемой: в приложении doc/view я в классе документа создаю таблицу примерно 60*400 ячеек, каждая 50*15 пикселей, инициализирую каждую ячейку, задавая её положение на экране, цвет, размер шрифта и т.д. Вывод на экран в OnDraw представления — в цикле перебираю все ячейки и рисую по имеющимся в каждой из них данным. Но когда прокручиваю содержимое представления перерисовка происходит отвратительно медленно, хотя перерисовываю только те ячейки, который попадают в область перерисовки.
С>Что делать ума не приложу, помогите пожалуйста кто может.
рисовать в памяти (memory DC)- и кидать потом на экран (DC)... может не быстрее — но фликеринга не
будет и будет казаться что быстрее.
* thriving in a production environment *
Re[2]: Как ускорить вывод на экран?
От: Юнусов Булат Россия  
Дата: 25.12.01 21:27
Оценка:
Здравствуйте Igor Soukhov, Вы писали:

IS>Здравствуйте Сергей, Вы писали:


С>>Привет народ!

С>>Вот сталкнулся с такой проблемой: в приложении doc/view я в классе документа создаю таблицу примерно 60*400 ячеек, каждая 50*15 пикселей, инициализирую каждую ячейку, задавая её положение на экране, цвет, размер шрифта и т.д. Вывод на экран в OnDraw представления — в цикле перебираю все ячейки и рисую по имеющимся в каждой из них данным. Но когда прокручиваю содержимое представления перерисовка происходит отвратительно медленно, хотя перерисовываю только те ячейки, который попадают в область перерисовки.
С>>Что делать ума не приложу, помогите пожалуйста кто может.
IS>рисовать в памяти (memory DC)- и кидать потом на экран (DC)... может не быстрее — но фликеринга не
IS>будет и будет казаться что быстрее.

Есть уже готовый враппер — входит во многие самплесы которые на кодегуру сидят
CMemDC называется — весьма полезная вещь

в этой штуке точно есть
http://www.codeguru.com/controls/gridctrl.shtml
Re[3]: Как ускорить вывод на экран?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.12.01 00:33
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Есть уже готовый враппер — входит во многие самплесы которые на кодегуру сидят

ЮБ>CMemDC называется — весьма полезная вещь

ЮБ>в этой штуке точно есть

ЮБ>http://www.codeguru.com/controls/gridctrl.shtml


В ascLib он сто лет есть. Причем я не видел такого же удобного варианта. Но вот скорости отрисовки он не прибавит. Наоборот замедлит. Если флики не беспокоят, то лучше MemDC не юзать.

Методы ускорения такие:

Рисовать текст с помощью функции TextOutEx, а не DrawText.

Закрашивать фон в той же функции, а не отдельным вызовом.

Если шрифт не изменяется от колонки к колонке, но менять его в cd.

Использовать битмапные шрифты (например, "MS Sans Serif").

При выводе графики использовать или ImageList или прямой битбилт

Не создавать объектов в хипе при отрисовке и не выделять там же память

Максимально уменьшить все расчеты (например, расчеты размера текста)

Убедиться что не происходит повторных перерисовок

Рисовать линии не с помощью функций рисования линий и прямоугольников (можно использовать TextOutEx с пустой строкой)

Замерить с помощью высокоточного таймера общее время отрисовки ячейки и каждой его части. В последствии разобраться с наиболее тормозными местами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Как ускорить вывод на экран?
От: Сергей  
Дата: 26.12.01 12:20
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Юнусов Булат, Вы писали:


ЮБ>>Есть уже готовый враппер — входит во многие самплесы которые на кодегуру сидят

ЮБ>>CMemDC называется — весьма полезная вещь

ЮБ>>в этой штуке точно есть

ЮБ>>http://www.codeguru.com/controls/gridctrl.shtml


VD>В ascLib он сто лет есть. Причем я не видел такого же удобного варианта. Но вот скорости отрисовки он не прибавит. Наоборот замедлит. Если флики не беспокоят, то лучше MemDC не юзать.


VD>Методы ускорения такие:


VD>Рисовать текст с помощью функции TextOutEx, а не DrawText.


VD>Закрашивать фон в той же функции, а не отдельным вызовом.


VD>Если шрифт не изменяется от колонки к колонке, но менять его в cd.


VD>Использовать битмапные шрифты (например, "MS Sans Serif").


VD>При выводе графики использовать или ImageList или прямой битбилт


VD>Не создавать объектов в хипе при отрисовке и не выделять там же память


VD>Максимально уменьшить все расчеты (например, расчеты размера текста)


VD>Убедиться что не происходит повторных перерисовок


VD>Рисовать линии не с помощью функций рисования линий и прямоугольников (можно использовать TextOutEx с пустой строкой)


VD>Замерить с помощью высокоточного таймера общее время отрисовки ячейки и каждой его части. В последствии разобраться с наиболее тормозными местами.



Интересно как такой хорошей скорости добились в ms excell ?
Re[5]: Как ускорить вывод на экран?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.12.01 21:39
Оценка:
Здравствуйте Сергей, Вы писали:

С>Интересно как такой хорошей скорости добились в ms excell ?


Там все кешируется (для каждой ячейки хранятся все значения в виде формул и в виде текста, фрифты и т.п. тоже имеются к моменту отрисовки). А сам вывод много времени не занимает.

PS

Когда мы в ascDb-гриде начали оптимизировать отрисовку я тоже такие вопросты задавал, а когда закончили, то оказалось, что у нас не медленнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Спасибо, но похоже что дело не только в этом!!
От: Аноним  
Дата: 05.01.03 15:17
Оценка:
Столкнулся с аналогичной проблемой, "решил" тем что перенес весь код из СView::OnDraw в CMyWnd::OnPaint и там отрисовка работает на ура. А вот как сделать это в СView не знаю.
Re[5]: Как ускорить вывод на экран?
От: Можаев Михаил Россия www.mozhay.chat.ru
Дата: 08.01.03 10:23
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Интересно как такой хорошей скорости добились в ms excell ?


Если это не секрет, приведи кусок кода из CYourView::OnDraw(). Думаю, так будет проще посоветовать что-нибудь дельное.
Re[5]: Спасибо, но похоже что дело не только в этом!!
От: SlaG  
Дата: 08.01.03 11:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Столкнулся с аналогичной проблемой, "решил" тем что перенес весь код из СView::OnDraw в CMyWnd::OnPaint и там отрисовка работает на ура. А вот как сделать это в СView не знаю.


При скролинге окна надо юзать функцию ScrollWindow на ту область, которую можно просто сдвинуть, не перерисовывая. Далее InvalidateRect, чтобы поставить клипинг на область, которая "вылезла" (она как правило намного меньше всей клиентской). GDI-функции будут побыстрей отрабатывать (вроде учитывают клипинг).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.