¿Por qué es DoubleBuffered desactivado por defecto?

Después de la creación de una nueva forma, me suelen llevar a cabo este ritual:

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

Me he estado preguntando por un tiempo ¿por qué el valor predeterminado es ‘False’. A mí sólo se ve de baja tecnología y de mierda, y en mi nueva máquina no noto ninguna diferencia en el rendimiento.

Es doublebuffering problemática en máquinas más antiguas, VNC, Escritorio Remoto o en Máquinas Virtuales, tal vez?

Hacer lo deja encendido o apagado? Alguna recomendación?

4 Kommentare

  1. 32

    Como usted probablemente sabe, un doble búfer normalmente implica la creación de una pantalla de búfer de memoria del mismo tamaño que el componente visual. Escritura/dibujo se realiza en este buffer y cuando se complete, el buffer completo es «intercambia», de modo que ahora está pintado en el componente visual.

    (Nota: el «intercambio» puede consistir simplemente en cambiar la dirección de un puntero que señala a, o en realidad puede implicar copiar un fragmento de memoria, tales como el uso de BitBlt, memcpy etc)

    Por tanto, una razonable cantidad de memoria asignada para apoyar este proceso para cada componente esté habilitada. Si su aplicación tiene muchas ventanas o y/o componentes no sería un no despreciable cantidad de memoria asignada. Si no se requieren visual suave actualizaciones/desplazamiento, ¿por qué desperdiciar esta memoria?

    Por supuesto, también hay un argumento que hoy en día la mayoría de los equipos tienen un montón de memoria de sobra, así que ¿por qué preocuparse. Sin embargo, todavía no veo esto como una razón para predeterminada para la habilitación de Doble Búfer si usted no lo necesita.

    Si la configuración manual de la DoubleBuffered a la verdad es un dolor para usted, siempre se puede crear su propio control personalizado/componente que hereda de la incorporada en el de control, y establece DoubleBuffered (y otras propiedades) a sus valores predeterminados.

    • +1 bonita respuesta. Pequeñeces: reemplazar «copiar rápidamente» con «intercambia» o algo que no da la impresión de que no hay en realidad una copia de búfer pasando. Generalmente búfer de swaps son simples puntero swaps.
    • Buen punto, he actualizado la respuesta. Por supuesto en Windows Forms.NET también hay un «pretender» doble búfer, que en realidad es sólo una copia de la memoria.
    • Cuando DoubleBuffered es cierto, un control responde a la pintura mensajes como este: crea un mapa de bits, pinturas para el mapa de bits, llamadas BitBlt para copiar el mapa de bits en la ventana, y luego destruye el mapa de bits. No es sólo un simple puntero de intercambio.
    • He añadido una nota a la respuesta sobre el puntero de swaps y copiar en la memoria.
    • @Rob, lo siento por el tipo en su nombre!
  2. 25

    Doble búfer de evitarse cuando se hace de Escritorio Remoto de algún tipo, ya que todo el mapa de bits de control/formulario debe ser enviado a través de la red para hacer el BitBlt. ver este blog

    • +1 Impresionante. Tan evidente el momento en que usted lo señala, pero nunca se me ocurrió que sería este el caso. Que voy me hacen repensar algunos de mis programas…. gracias por señalarlo!
    • +1 de acuerdo con lo mencionado anteriormente!
  3. 12

    De un moderno sistema operativo que hace de escritorio de composición doble búfer en realidad puede disminuir el rendimiento. La representación se realiza en una pantalla de mapa de bits de todos modos, así que usar el doble búfer conduce a un extra que hay que copiar de ningún beneficio en esos sistemas. Así que a menos que la VCL es lo suficientemente inteligente como para ignorar el doble búfer en ese caso (no sé si lo hace, tendría que comprobarlo) puede ser en realidad mejor no se establece de manera incondicional.

    Edición:

    He comprobado, y en ambos Delphi Delphi 2007 y 2009, el TWinControl.WMPaint método no utiliza el doble búfer cuando DwmCompositionEnabled devuelve True. Bueno.

  4. 1

    También podría crear un diseño experto que ajusta automáticamente este valor para cada forma de control/crear, en lugar de derivar nuevos controles para cada uno existente que implicaría mucho más trabajo.
    Ver código fuente en GExperts.org para tener una idea de cómo lograrlo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea