Примерно это выглядит вот так:
- Код: Выделить всё
' [*] Функция Redraw
'// [?] Легенда:
' - iNumObj: кол-во объектов
' - iNumLines: кол-во связей
'// Объекты
for i = 1 to iNumObj
GdiTransparentBlt данные из массива объектов(i)
TextOut ...(i) '// подпись объекта
'// + рамка для текста и дополнительные "примочки"
Next i
'// Связи
for i = 1 to iNumLines
MoveToEx ...(i)
LineTo ...(i)
Next i
При каких либо изменениях на экране - вызывается функция и перерисовывает всё, например, при таскании объекта мышкой. Кто-то скажет, что перерисовывать ВСЁ - глупо, особенно если изменения происходят только у одного объекта. Но нет, я пытался реализовать - что, только определённые объекты перерисовываются - например, тот, который перемещается и те которых он задел при перемещении, а также примыкающие и задетые линии. Но, а если объектов 200 и пользователь выделил 50 и таскает их? Получались те же тормоза, и пришлось отказаться от этого!
Вот это она и есть, основная проблема - медленность перерисовки в режиме реального времени.
Однократно это рисуется мгновенно, но при "таскании" объекта мышью (задействовано в событии MouseMove - ПикБокса) идёт непрерывная перерисовка, которая здорово тормозит... Причём, чем больше размер PictureBox - тем больше тормоза, в моём случае он занимает почти весь экран в развёрнутом виде *(минус) меню и панель инструментов.
Исследования:
по началу линии текст и фигуры рисовались обычными средствами VB6... Line, Print... Кроме Иконок, которые изначально рисовались двойным BitBlt (+маска прозрачности), который позже был заменён на GdiTransparentBlt. К сожалению, последняя функция в разы медленней, но по заданию, пользователь может сам добавлять иконки с каналом прозрачности по розовому цвету - пришлось отказаться от BitBlt.
Затем Line и Print - были заменены на их GDI-аналоги. Прироста производительности при этом не было. Убирая всё рисуемое кроме иконок - производительность была очень неплохой. Из чего я сделал вывод, что тормоза происходят из-за линий, фигур и текста. Как с этим бороться?
Необходимо чтобы при перемещении объектов они все двигались плавно и без тормозов.
Посоветуйте, пожалуйста, что можно придумать в данной ситуации? Может, есть смысл использовать DirectDraw - но даст ли это желаемой скорости?