Парадоксы двойной буферизации

Jun 11, 2015 12:41

На днях написал очередную программку на Лазарусе, решил показать коллегам. Но тут оказалось, что на всех компьютерах, кроме того, на котором я её писал, при рисовании изображения происходит жуткое хаотическое моргание. В данном случае это не имело большого значения, поскольку в этой программе главным результатом была сама картинка, а не процесс её рисования (как в случае с предъявлением движущихся стимулов). Но всё равно неприятно - ведь я относился к Лазарусу, как к универсальному инструменту. А если это не так, то как теперь стимулы предъявлять? Поэтому, вместо того, чтобы погрузиться, наконец, в насущные проблемы, стал разбираться с происходящим. Вначале попытался реже вызывать обработку сообщений (Application.ProcessMessages), чтобы обновлять не построчно и не попиксельно, а крупными блоками. Эффект от этого небольшой, и на разных компьютерах разный. Позже обнаружил, что изображение моргает и при изменении размеров формы (причём даже тогда, когда размер формы выбран с запасом, и перерисовка изображения не требуется), так что методы рисования здесь оказались вообще ни при чём. Оказалось, что у элемента класса TWinControl есть свойство DoubleBuffered, которое и отвечает за отсутствие мерцания при перерисовывании, но почему-то по умолчанию это свойство установлено в False. Если у формы включить двойную буферизацию, то всё начинает рисоваться привычно, без морганий. Осталось непонятным, почему на моём компьютере этого моргания нет и без двойной буферизации. Надо сказать, что на двух из исследованных компьютеров была установлена система Windows XP, на одном Windows 98, а на моём - Windows 7. То ли эта буферизация уже производится в Windows 7, то ли это редкое свойство отдельно взятой видеоплаты и её отдельно взятого драйвера.

Надо сказать, с гуглением у меня всегда проблемы - не знаю, как задать вопрос. Смутно помнил, что что-то такое было в OpenGL, но как называлось - забыл. Почитал Tutorial, понял, что это gluSwapBuffers. Во встроенном chm-help'е об этом ничего не нашёл. Потом решил поискать в help'е слово flicker, и этот путь оказался верным - вышел на TWinControl.DoubleBuffered.

Программирование

Previous post Next post
Up