GDI +, безусловно, достаточно быстр для программы рисования. Я использую его (из C #) для высокоскоростной анимации (> 30 кадров в секунду).
Похоже, вы хотите иметь возможность манипулировать отдельными пикселями. Это очень быстро с LockBits, и хотя это немного неудобно для использования в C # (требует указателя и тега unsafe
), это не кажется таким сложным в C ++.
Вероятно, вы не захотите копировать из нескольких слоев прямо на поверхность управления внутри события рисования. Вместо этого этот рендеринг должен выполняться во внеэкранном буфере (B1). После того, как B1 будет отрисован со всеми завершенными операциями копирования / рисования, скопируйте его во второй внеэкранный буфер (B2), а затем сделайте недействительным / обновите вашу поверхность управления. В событии рисования элемента управления вы копируете из B2 на видимую поверхность.
Вы не хотите рисовать непосредственно на видимой поверхности с помощью многоэтапной операции рисования, так как это приведет к некоторой форме мерцания (иногда экран перерисовывается, пока ваш код находится только на полпути через многоэтапную операцию, поэтому пользователь видит случайные недоработанные кадры).
Вы можете выполнить рендеринг в один внеэкранный буфер и скопировать из него на видимую поверхность в событии рисования. Основная сложность здесь заключается в том, что вам нужно каким-то образом иметь дело с «случайными» событиями рисования, то есть событиями, вызванными не тем, что вы намеренно аннулируете элемент управления, а чем-то другим (например, пользователем, перетаскивающим другое окно поверх вашего). Если вы копируете из внеэкранного буфера на поверхность, а буфер нарисован только наполовину, вы получите мерцание. Если вы заблокируете событие рисования до завершения рисования буфера, вы увидите «следы формы» на вашем элементе управления, что выглядит еще хуже.
Решением является описанный выше подход с двойной буферизацией. Случайные (или не случайные, если вы аннулируете) события рисования будут копироваться из B2, который всегда полностью отрисован и актуален - поэтому мерцания нет. Двойная буферизация требует больше памяти, но в программе рисования, которая в любом случае имеет несколько слоев, это не имеет большого значения.
person
MusiGenesis
schedule
01.05.2010