Почему DoubleBuffer отключен по умолчанию?
После создания новой формы я обычно выполняю этот ритуал:
- Измените имя на что-то значимое;
- Введите a
Caption
;
- Измените свойство position (DefaultPosOnly вряд ли будет когда-либо ожидаемым пользователем);
- Установите
ShowHint
в true
;
- Установить
DoubleBuffered
в true
;
Некоторое время я задавался вопросом, почему значение по умолчанию - "Ложно". Для меня это просто выглядит низкотехнологичным и дерьмовым, и на моей новой машине я не замечаю никакой разницы в производительности.
Является ли проблема с двойной загрузкой более старой машиной, VNC, удаленным рабочим столом или виртуальными машинами?
Вы оставляете его включенным или выключенным? Любые рекомендации?
Ответы
Ответ 1
Как вы, вероятно, знаете, двойной буфер обычно включает создание буфера памяти вне экрана того же размера, что и визуальный компонент. Запись/рисование выполняется в этом буфере, и когда он завершен, весь буфер "заменяется" так, что теперь он отображается на визуальном компоненте.
(Примечание: "замена" может состоять в простом изменении адреса, на который указывает указатель, или может фактически включать копирование части памяти, например, с помощью BitBlt, memcpy и т.д.)
Поэтому разумный объем памяти, выделенный для поддержки этого процесса для каждого компонента, для которого он включен. Если в вашем приложении много окон и/или компонентов, будет выделяться не несущественный объем выделенной памяти. Если вам не нужны плавные визуальные обновления/прокрутка, зачем тратить эту память?
Конечно, есть также аргумент, что сегодня на большинстве компьютеров достаточно памяти, чтобы избавиться, поэтому зачем беспокоиться. Однако я по-прежнему не вижу в этом причины по умолчанию включения Double Buffering, если он вам не нужен.
Если вручную установить DoubleBuffered в true, вы всегда можете создать свой собственный элемент управления/компонент, который наследуется от встроенного элемента управления, и устанавливает значения DoubleBuffered (и других свойств) в требуемые значения по умолчанию.
Ответ 2
Следует избегать двойной буферизации при выполнении какого-либо удаленного рабочего стола, поскольку для создания BitBlt необходимо отправлять всю битовую карту элемента управления/формы по сети. смотрите этот блог...
Ответ 3
В современной ОС, которая делает двойную буферизацию компоновки на рабочем столе, может фактически снизить производительность. В любом случае рендеринг выполняется в растровое изображение вне экрана, поэтому использование двойной буферизации приводит к дополнительному копированию, не имеющему никакой пользы в этих системах. Поэтому, если VCL достаточно умен, чтобы игнорировать двойную буферизацию в этом случае (не знаю, будет ли это делать, нужно будет проверить), на самом деле может быть лучше не устанавливать ее безоговорочно.
Edit:
Я проверил, и в Delphi 2007 и Delphi 2009 метод TWinControl.WMPaint
не использует двойную буферизацию, когда DwmCompositionEnabled
возвращает True
. Ницца.
Ответ 4
Вы также можете создать эксперта по времени разработки, который автоматически устанавливает это значение для каждой формы/элемента управления, которую вы создаете, вместо того, чтобы получать новые элементы управления для всех существующих, которые будут включать гораздо больше работы.
См. Исходный код на GExperts.org, чтобы получить представление о том, как достичь этого.