Мерцание при перерисовке в MFC - PullRequest
1 голос
/ 20 сентября 2010

Я пишу тетрис с использованием C ++ и MFC.У меня есть таймер и обработчик OnTimer.Обработчик выглядит так:

... do some game-only logic ...
this->RedrawWindow();

А в обработчике OnPaint я рисую блоки, карту (с фоном растрового изображения), счет и т.д. Для рисования я использую растровые изображения и функцию BitBlt.Все нарисовано с нуля, я перерисовываю всю область окна.Общая производительность нормальная, иногда мерцает, но это нормально, но когда я добавил растровый фон на карту, мерцание во время перерисовки стало невыносимым.Нужно ли использовать другие алгоритмы для рисования растрового изображения, или, может быть, я неправильно выполняю все перерисовки при каждом запуске OnPaint?

Как устранить мерцание?Я могу использовать только C ++ и MFC, последний, к сожалению, я вообще не знал до начала этого проекта.

Итак, еще раз: как я могу устранить мерцание и повысить производительность перерисовки?

Ответы [ 4 ]

6 голосов
/ 20 сентября 2010

Попробуйте двойную буферизацию. «Двойная буферизация» относится к технике записи в DC памяти и последующего бит-вывода DC памяти на экран.

В связи с Windows этот метод может использоваться для обработки сообщений WM_PAINT. Ваша функция OnDraw вызывает BitBlt для копирования памяти DC в экран DC. DC памяти связан с переменной-членом в классе представления и записывается в то время, когда другие сообщения не обрабатываются.

Вот ссылка для некоторого кода, который может помочь.

6 голосов
/ 20 сентября 2010

Попробуйте переопределить CWnd :: OnEraseBkgnd , чтобы просто вернуть ненулевое значение. Это говорит о том, что вы сами удалили фон окна.

1 голос
/ 20 сентября 2010

Одним из возможных решений является наличие в памяти растрового изображения (DC) для всего чертежа, а затем перетаскивание его на экран, как только вы закончите со всем рисунком. Когда вы рисуете все объекты на экране один за другим, может возникнуть мерцание. Если вы используете растровое изображение в памяти, у вас не будет мерцания. Это псевдокод:

Clear Memory Buffer
Blit the background bitmap on the Memory Buffer
For each entity that needs to be drawn
    Draw entity on Memory Buffer
Blit the Memory Buffer to the screen DC
0 голосов
/ 20 сентября 2010

Вы должны применить оба предыдущих anwsers.

Если вы рисуете всю область окна, вы должны переопределить OnEraseBkgnd (как предложено sje397), чтобы Windows не окрашивала фон в серый.Это то, что вызывает мерцание.

Но вам также лучше применить технику двойной буферизации.Таким образом, рисование будет сделано в памяти и скопировано сразу на экран.Это также улучшит вашу производительность.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...