Здравствуйте!
Есть:
Графический компонент размером с саму форму,
Перерисовка с двойной буферизацией
Сам компонент сдержит около 5 тысяч мелких элементов, которые он и отрисовывает сначала в Bitmap, а затем все скидывается на экран.
Подскажите, как можно оптимизировать перерисовку графики. Дело в том, что если например поверх главного окна потаскать что нить вроде калькулятора, то загрузка проца взлетает до бесконечного цикла...
например в Acdsee такого не наблюдается. Есть скачок загрузки в пределах 10%, когда моя прога вешает систему на 50%.
Здравствуйте, 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? Это для двойной буферизации?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, dorofeevilya, Вы писали:
D>>А для чего скидывать сначала в Bitmap? Это для двойной буферизации?
А>Она самая...
У винформс-контролов есть protected свойство DoubleBuffered. Я наследовал свой класс от нужного мне контейнера (напр. от System.Windows.Forms.Panel), и уже в своем классе, например, в конструкторе, делал
DoubleBuffered = true;
Стало явно лучше. Даже именно так, как хотелось. Конечно, у меня не было пяти тысяч элементов. Не знаю, может быть для такого объема графики имеет смысл рассмотреть более подходящие пакеты... Все таки GDI+, на мой взгляд, нужен для чего-нибудь попроще.
Re[4]: Медленная перерисовка в C#
От:
Аноним
Дата:
15.01.08 10:56
Оценка:
Фишка навеное не в том, сколько объектов я рисую... это быстро и... можно сказать безболезненно для быстродействия...
суть проблемы в другом:
выводим картинку... большую картинку... а при перерисовке от винды (когда поверх картинки таскаем какую нить форму) сильно нагружается процессор... уж шибко часто приходи разного рода OnPaint
Здравствуйте, Аноним, Вы писали:
А>Фишка навеное не в том, сколько объектов я рисую... это быстро и... можно сказать безболезненно для быстродействия...
А>суть проблемы в другом: А>выводим картинку... большую картинку... а при перерисовке от винды (когда поверх картинки таскаем какую нить форму) сильно нагружается процессор... уж шибко часто приходи разного рода OnPaint
У меня тоже проц загружается на все 100. Но тормозов особых не наблюдается. Я, собственно говоря, и не заморачивался))) Если для тебя это критично, то даже и не знаю, что посоветовать(((
Суть именно в оптимизации перерисовки:
Например, при получении OnPaint, незачем перерисовывать все окно!
или при перетаскивании формы поверх моей, мне приходят куча прямоугольных запросов единичной ширины на перерисовку.
Я попытался их объединить в один большой, и потом перерисовать — выиграл порядка 15%... может что-то не так делаю
Здравствуйте, BirkOFH, Вы писали:
BOF>Здравствуйте!
BOF>Есть идеи?
Когда писал проект который много рисует, то для ускорения отрисовки и разгрузки процессора устанавливал фраг изменения содержимого.
Само содержимое хранилось в буфферном битмапе. А при OnPaint я проверял, если было изменение содержимого, то перерисовывал буфферный битмап и обновлял картинку, если изменений небыло, то барл старое содержимое. Таким образом затраты ресурсов были минимальны, если не считать того, что буфферный битмап постоянно висел в памяти. Но скорость была отличная.
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Здравствуйте, Gromo.Boy, Вы писали:
GB>Здравствуйте, BirkOFH, Вы писали:
BOF>>Здравствуйте!
BOF>>Есть идеи?
GB>Когда писал проект который много рисует, то для ускорения отрисовки и разгрузки процессора устанавливал фраг изменения содержимого. GB>Само содержимое хранилось в буфферном битмапе. А при OnPaint я проверял, если было изменение содержимого, то перерисовывал буфферный битмап и обновлял картинку, если изменений небыло, то барл старое содержимое. Таким образом затраты ресурсов были минимальны, если не считать того, что буфферный битмап постоянно висел в памяти. Но скорость была отличная.