delphi delphi-2009 doublebuffered

delphi - ¿Por qué DoubleBuffered está deshabilitado de manera predeterminada?



delphi-2009 (4)

Después de crear una nueva forma, generalmente realizo este ritual:

  1. Cambie el nombre en algo significativo;
  2. Escriba un título;
  3. Cambiar la propiedad de posición (DefaultPosOnly casi nunca es lo que esperan los usuarios);
  4. Establezca ShowHint en true ;
  5. Establezca DoubleBuffered en true ;

Me he estado preguntando por un tiempo por qué el valor predeterminado es ''False''. Para mí, parece de baja tecnología y malísimo, y en mi nueva máquina no noto ninguna diferencia en el rendimiento.

¿Es problemático el doble buffer en máquinas más antiguas, VNC, escritorio remoto o en máquinas virtuales?

¿Lo dejas encendido o apagado? ¿Alguna recomendación?


Como probablemente sepa, un doble buffer normalmente implica crear un buffer de memoria fuera de la pantalla del mismo tamaño que el componente visual. La escritura / dibujo se realiza en este búfer y cuando se completa, todo el búfer se "intercambia" para que quede pintado en el componente visual.

(Nota: "intercambiar" puede consistir simplemente en cambiar la dirección a la que señala un puntero, o puede implicar la copia de un trozo de memoria, como el uso de BitBlt, memcpy, etc.)

Por lo tanto, se asigna una cantidad razonable de memoria para admitir este proceso para cada componente para el que está habilitado. Si su aplicación tiene muchas ventanas y / o componentes, habría una cantidad no despreciable de memoria asignada. Si no necesita actualizaciones visuales / desplazamiento sin problemas, ¿por qué perder esta memoria?

Por supuesto, también existe el argumento de que hoy en día la mayoría de las computadoras tienen suficiente memoria, entonces ¿por qué preocuparse? Sin embargo, todavía no veo esto como una razón para activar de forma predeterminada el Doble Buffering si no lo necesita.

Si configurar manualmente DoubleBuffered en true es una molestia para usted, siempre puede crear su propio control / componente personalizado que herede del control incorporado, y establece DoubleBuffered (y otras propiedades) a sus valores predeterminados requeridos.


El búfer doble debe evitarse cuando se hace Remote Desktop de algún tipo, ya que todo el mapa de bits del control / formulario debe enviarse a través de la red para hacer el BitBlt. ver esta publicación en el blog ...


En un sistema operativo moderno que hace composición de escritorio, el doble buffer puede en realidad disminuir el rendimiento. El renderizado se realiza de todos modos en un mapa de bits fuera de la pantalla, por lo que el doble uso del búfer genera una copia adicional sin ningún beneficio en esos sistemas. Entonces, a menos que el VCL sea lo suficientemente inteligente como para ignorar el doble buffer en ese caso (no sé si lo hace, debería verificarlo), en realidad sería mejor no configurarlo incondicionalmente.

Editar:

Comprobé, y tanto en Delphi 2007 como en Delphi 2009, el método TWinControl.WMPaint no usa el doble almacenamiento en búfer cuando DwmCompositionEnabled devuelve True . Bonito.


También podría crear un experto en tiempo de diseño que establezca automáticamente este valor para cada formulario / control que cree, en lugar de derivar nuevos controles para cada uno existente, lo que implicaría mucho más trabajo. Vea el código fuente en GExperts.org para tener una idea de cómo lograr esto.