Медленная перерисовка в C#
От: BirkOFH  
Дата: 15.01.08 08:02
Оценка:
Здравствуйте!
Есть:
Графический компонент размером с саму форму,
Перерисовка с двойной буферизацией
Сам компонент сдержит около 5 тысяч мелких элементов, которые он и отрисовывает сначала в Bitmap, а затем все скидывается на экран.

Подскажите, как можно оптимизировать перерисовку графики. Дело в том, что если например поверх главного окна потаскать что нить вроде калькулятора, то загрузка проца взлетает до бесконечного цикла...

например в Acdsee такого не наблюдается. Есть скачок загрузки в пределах 10%, когда моя прога вешает систему на 50%.

Есть идеи?
Re: Медленная перерисовка в C#
От: dorofeevilya Россия  
Дата: 15.01.08 09:16
Оценка:
Здравствуйте, BirkOFH, Вы писали:

BOF>Здравствуйте!

BOF>Есть:
BOF>Графический компонент размером с саму форму,
BOF>Перерисовка с двойной буферизацией
BOF>Сам компонент сдержит около 5 тысяч мелких элементов, которые он и отрисовывает сначала в Bitmap, а затем все скидывается на экран.

BOF>Подскажите, как можно оптимизировать перерисовку графики. Дело в том, что если например поверх главного окна потаскать что нить вроде калькулятора, то загрузка проца взлетает до бесконечного цикла...


BOF>например в Acdsee такого не наблюдается. Есть скачок загрузки в пределах 10%, когда моя прога вешает систему на 50%.


BOF>Есть идеи?


А для чего скидывать сначала в Bitmap? Это для двойной буферизации?
Re[2]: Медленная перерисовка в C#
От: Аноним  
Дата: 15.01.08 10:39
Оценка:
Здравствуйте, dorofeevilya, Вы писали:

D>А для чего скидывать сначала в Bitmap? Это для двойной буферизации?


Она самая...
Re[3]: Медленная перерисовка в C#
От: dorofeevilya Россия  
Дата: 15.01.08 10:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dorofeevilya, Вы писали:


D>>А для чего скидывать сначала в Bitmap? Это для двойной буферизации?


А>Она самая...


У винформс-контролов есть protected свойство DoubleBuffered. Я наследовал свой класс от нужного мне контейнера (напр. от System.Windows.Forms.Panel), и уже в своем классе, например, в конструкторе, делал
DoubleBuffered = true;

Стало явно лучше. Даже именно так, как хотелось. Конечно, у меня не было пяти тысяч элементов. Не знаю, может быть для такого объема графики имеет смысл рассмотреть более подходящие пакеты... Все таки GDI+, на мой взгляд, нужен для чего-нибудь попроще.
Re[4]: Медленная перерисовка в C#
От: Аноним  
Дата: 15.01.08 10:56
Оценка:
Фишка навеное не в том, сколько объектов я рисую... это быстро и... можно сказать безболезненно для быстродействия...

суть проблемы в другом:
выводим картинку... большую картинку... а при перерисовке от винды (когда поверх картинки таскаем какую нить форму) сильно нагружается процессор... уж шибко часто приходи разного рода OnPaint
Re[5]: Медленная перерисовка в C#
От: dorofeevilya Россия  
Дата: 15.01.08 11:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Фишка навеное не в том, сколько объектов я рисую... это быстро и... можно сказать безболезненно для быстродействия...


А>суть проблемы в другом:

А>выводим картинку... большую картинку... а при перерисовке от винды (когда поверх картинки таскаем какую нить форму) сильно нагружается процессор... уж шибко часто приходи разного рода OnPaint

У меня тоже проц загружается на все 100. Но тормозов особых не наблюдается. Я, собственно говоря, и не заморачивался))) Если для тебя это критично, то даже и не знаю, что посоветовать(((
Re[6]: Медленная перерисовка в C#
От: BirkOFH  
Дата: 15.01.08 11:14
Оценка:
Суть именно в оптимизации перерисовки:
Например, при получении OnPaint, незачем перерисовывать все окно!
или при перетаскивании формы поверх моей, мне приходят куча прямоугольных запросов единичной ширины на перерисовку.
Я попытался их объединить в один большой, и потом перерисовать — выиграл порядка 15%... может что-то не так делаю

это вот я собираю запросы на перерисовку области
       protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            Rects.Add(e.ClipRectangle);
        }


и примерно 20 раз в секунду делаю перерисовку, если нужно
Re: Медленная перерисовка в C#
От: Gromo.Boy Россия  
Дата: 21.01.08 16:41
Оценка:
Здравствуйте, BirkOFH, Вы писали:

BOF>Здравствуйте!


BOF>Есть идеи?


Когда писал проект который много рисует, то для ускорения отрисовки и разгрузки процессора устанавливал фраг изменения содержимого.
Само содержимое хранилось в буфферном битмапе. А при OnPaint я проверял, если было изменение содержимого, то перерисовывал буфферный битмап и обновлял картинку, если изменений небыло, то барл старое содержимое. Таким образом затраты ресурсов были минимальны, если не считать того, что буфферный битмап постоянно висел в памяти. Но скорость была отличная.
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[2]: Медленная перерисовка в C#
От: dorofeevilya Россия  
Дата: 21.01.08 16:45
Оценка:
Здравствуйте, Gromo.Boy, Вы писали:

GB>Здравствуйте, BirkOFH, Вы писали:


BOF>>Здравствуйте!


BOF>>Есть идеи?


GB>Когда писал проект который много рисует, то для ускорения отрисовки и разгрузки процессора устанавливал фраг изменения содержимого.

GB>Само содержимое хранилось в буфферном битмапе. А при OnPaint я проверял, если было изменение содержимого, то перерисовывал буфферный битмап и обновлял картинку, если изменений небыло, то барл старое содержимое. Таким образом затраты ресурсов были минимальны, если не считать того, что буфферный битмап постоянно висел в памяти. Но скорость была отличная.

Эдакий извращенный MVC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.