Подтвердить что ты не робот

Почему DoubleBuffer отключен по умолчанию?

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

  • Измените имя на что-то значимое;
  • Введите a Caption;
  • Измените свойство position (DefaultPosOnly вряд ли будет когда-либо ожидаемым пользователем);
  • Установите ShowHint в true;
  • Установить DoubleBuffered в true;

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Edit:

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

Ответ 4

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