![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
В общем встала задача отображать графики с прокруткой.
Данные поступают каждые 100мс по RS-232. В принципе я это реализовал на канве, но при прокрутке все тормозит (т.к. идет копирование CopyRect) очень большой кусок нужно перерисовывать. Можно ли чертить графики с помощью DirectDraw или не стоит оно того и нужно оптимизировать процедуру копирования из скрытого буфера на канву на экране? Спасибо. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Что-то мне подсказывает, что сама организация неправильная...
Зачем копирование из буфера? Не проще ли перерисовать график по сохраненным данным? Ведь экран 800х600 в виде битмапа занимает столько памяти, сколько хватило бы для хранения 120000 целых 4-х байтовых значений. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
С формой лучше не связываться.
Форма всегда тормозит. Рисуй в Timage или на TPanel -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
Хм...
Вот что я делаю. На форме у меня TPanel. Я в памяти формирую "пустой" TBitmap с нарисованными осями и т.п., затем я копирую его в еще один буфер и рисую на нем все что нужно (собственно графики и шкалы), затем копирую его на TPanel. В итоге все здорово тормозит. Если рисовать прямо на TPanel то все мерцаем при стирании предыдущего графика и рисовании нового (рисуется все в реальном мосштабе времени). Собственно поэтому вопрос и возник: как быстрее рисовать. Я где-то слышал что можно рисовать через DirectDraw (мол он специально для двухмерки сделан), но сам не рисовал, поэтому и решил спросить. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| s-mike |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Может объяснишь почему? Какая разница на чем рисовать на экране, если все это делать с помощью GDI? Добавлено @ 20:30
Ну вот я это и предполагал. Глупее организации не придумаешь. Хранить отрисованный растр глупо! Все нужно рисовать в runtime, о чем я и сказал выше. И DirectDraw не поможет. |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Совершенно верно!
Значительно бысрее рисовать оси и проч. на исходном BitMap - е чем несколько раз копировать один BitMap в другой, так как такие операции отнимают объективно очень много процессорного времени и DirectDraw здесь ни при чем. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
Еще раз:
МЕРЦАЕТ! Я точно знаю что можно рисовать с использованием DirectDraw, т.к. видел графики с его использованием, но к сожалению автора программы не выцепить уже. По поводу буферов:
СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Мерцает говоришь? Ну-ну...
Вот, накидал примерчик, не мерцает даже в полноэкранном режиме:
|
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
За пример спасибо, но:
Если рисовать не через 10 точек, а подряд; заполнять всю ширину и уменьшить интервал таймера до 50мс, то 99% ресурсов сжираются. Это при том что комп у меня не самый плохой, на работе это просто остановит систему. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Гм, у меня Athlon XP 2200+, 1 GB RAM, 128 Mb GeForce FX 5500 Video и загрузка процессора 2-4%. И это при том, что запущено несколько фоновых процессов. Так что это все относительно... Да и пример я сильно не оптимизировал, можно поработать... Хотя конечно большая часть процессорного времени тратится именно на отрисовку. А представь, какая была бы загрузка, если бы копировался растр? А использование памяти? Тут ни один DirectDraw не спасет. Можно попробовать, но мне кажется, что сильного выигрыша на столь простой задаче он не даст. А может и наоборот, поскольку повысится использование памяти (всякие COM&OLE-интерфейсы...). Да и то опять же - выигрыш будет только на хорошей видеокарте, потому что рисование будет полностью возложено на нее. Но на хорошей видеокарте и GDI неплохо идет. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Вопрос к Pilot
Как стираешь? С помощью patblt ? Это сообщение отредактировал(а) alexeis1 - 14.10.2005, 09:47 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Вот как раз _стирать_ есть неправильно, потому что какой-бы быстрой не была эта операция, но именно она приводит к мерцанию. Почему мерцает форма? Потому что перед OnPaint вызывается процедура стандартной отрисовки с другим цветом, как раз это я запрещаю перехватом WM_ERASEBKGND. Нужно исключительно отрисовывать поверх и желательно за один раз (чтобы не было видно, что сначала вся область закрашивается одним цветом, потом на ней что-то рисуется...). Поэтому стоит использовать буффер - в этом случае я создавал временный битмап, где и производил отрисовку. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |