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