Почему DoubleBuffered отключен по умолчанию? - PullRequest
25 голосов
/ 11 сентября 2009

После создания новой формы я обычно выполняю этот ритуал:

  1. Измените имя на что-то значимое;
  2. Введите Caption;
  3. Изменить свойство позиции (DefaultPosOnly вряд ли когда-либо ожидают пользователи);
  4. Установите ShowHint в true;
  5. Установить DoubleBuffered на true;

Некоторое время я задавался вопросом, почему значением по умолчанию является «Ложь». На мой взгляд, это выглядит не очень технологично и дрянно, и на моей новой машине я не вижу никакой разницы в производительности.

Является ли двойной буфер проблемным на старых машинах, VNC, удаленном рабочем столе или на виртуальных машинах?

Вы оставляете это включенным или выключенным? Любые рекомендации?

Ответы [ 4 ]

32 голосов
/ 11 сентября 2009

Как вы, вероятно, знаете, двойной буфер обычно включает создание буфера внеэкранной памяти того же размера, что и визуальный компонент. Запись / рисование выполняется в этом буфере, и когда он завершен, весь буфер «заменяется», так что теперь он рисуется на визуальном компоненте.

(Примечание: «замена» может состоять из простого изменения адреса, на который указывает указатель, или может фактически включать копирование фрагмента памяти, например, с использованием BitBlt, memcpy и т. Д.)

Поэтому разумный объем памяти выделяется для поддержки этого процесса для каждого компонента, для которого он включен. Если в вашем приложении много окон и / или компонентов, будет выделено немалое количество памяти. Если вам не требуется плавное визуальное обновление / прокрутка, зачем тратить эту память?

Конечно, есть также аргумент, что сегодня у большинства компьютеров есть достаточно памяти, так что зачем волноваться. Однако я до сих пор не вижу в этом причины по умолчанию включить двойную буферизацию, если она вам не нужна.

Если ручная установка DoubleBuffered в значение true является для вас проблемой, вы всегда можете создать свой собственный пользовательский элемент управления / компонент, который наследует от встроенного элемента управления, и установить для DoubleBuffered (и других свойств) требуемые значения по умолчанию.

25 голосов
/ 11 сентября 2009

Следует избегать двойной буферизации при выполнении какого-либо удаленного рабочего стола, поскольку для создания BitBlt необходимо передавать всю битовую карту элемента управления / формы по сети. см это сообщение в блоге ...

12 голосов
/ 11 сентября 2009

В современной ОС, которая использует настольную компоновку с двойной буферизацией, может фактически снизить производительность. В любом случае рендеринг выполняется за пределами экрана, поэтому двойная буферизация приводит к дополнительному копированию, что не дает никаких преимуществ в этих системах. Так что, если VCL не достаточно умен, чтобы игнорировать двойную буферизацию в этом случае (не знаю, будет ли он, нужно будет проверить), может быть лучше не устанавливать его безоговорочно.

Edit:

Я проверил, и в Delphi 2007 и Delphi 2009 метод TWinControl.WMPaint не использует двойную буферизацию, когда DwmCompositionEnabled возвращает True. Ницца.

1 голос
/ 22 марта 2011

Вы также можете создать эксперта времени разработки, который автоматически устанавливает это значение для каждой формы / элемента управления, которые вы создаете, вместо получения новых элементов управления для каждого существующего, что потребовало бы гораздо больше работы. Посмотрите исходный код на GExperts.org, чтобы понять, как этого добиться.

...