2009-09-11 16 views
25

Dopo aver creato una nuova forma, di solito eseguo questo rituale:Perché DoubleBuffered è disattivato per impostazione predefinita?

  1. Cambiare il nome in qualcosa di significativo;
  2. Digitare a Caption;
  3. Modificare la proprietà position (DefaultPosOnly non è quasi mai quello che gli utenti si aspettano);
  4. Impostare ShowHint a true;
  5. Set DoubleBuffered a true;

Mi sono chiesto per un po 'perché il valore predefinito è' False '. Per me sembra solo di bassa tecnologia e schifoso, e sulla mia nuova macchina non noto alcuna differenza nelle prestazioni.

È possibile che si verifichi un problema di doppio buffering su macchine precedenti, VNC, Desktop remoto o Macchine virtuali?

Lo lasci acceso o spento? Qualche consiglio?

risposta

32

Come probabilmente sapete, un doppio buffer di solito comporta la creazione di un buffer di memoria fuori schermo delle stesse dimensioni del componente visivo. La scrittura/disegno viene eseguito su questo buffer e una volta completato, l'intero buffer viene "scambiato" in modo che sia ora dipinto sul componente visivo.

(Nota: "scambio" può consistere semplicemente cambiando l'indirizzo puntatore viene, o può effettivamente comportare la copia di un blocco di memoria come l'utilizzo BitBlt, memcpy ecc)

Quindi una ragionevole quantità di memoria allocata per supportare questo processo per ogni componente per cui è abilitato. Se la tua applicazione ha molte finestre e/o componenti ci sarebbe una quantità non trascurabile di memoria allocata. Se non hai bisogno di aggiornamenti/scrolling visivi fluidi, perché sprecare questa memoria?

Naturalmente c'è anche un argomento che oggi la maggior parte dei computer ha molta memoria da perdere, quindi perché preoccuparsi. Tuttavia, non vedo ancora questo come un motivo di default per abilitare Double Buffering se non ne hai bisogno.

Se l'impostazione manuale di DoubleBuffered su true è un problema per te, puoi sempre creare il tuo controllo/componente personalizzato che eredita dal controllo integrato e imposta DoubleBuffered (e altre proprietà) sui valori predefiniti richiesti.

+1

+1 bella risposta. Nitpick: sostituisci "rapidamente copiato" con "scambiato" o qualcos'altro che non dà l'impressione che sia in corso una copia tampone. Di solito gli swap del buffer sono semplici scambi di puntatori. –

+0

Buon punto, ho aggiornato la risposta. Ovviamente in Windows Forms.NET esiste anche un doppio buffering "fittizio" che in realtà è solo una copia di memoria. – Ash

+11

Quando 'DoubleBuffered' è vero, un controllo risponde per dipingere messaggi come questo: Crea una bitmap, dipinge la bitmap, chiama' BitBlt' per copiare la bitmap sulla finestra e quindi distrugge la bitmap. Non è solo un semplice scambio di puntatori. –

12

Su un sistema operativo moderno che esegue il buffering doppio di desktop compositing può effettivamente ridurre le prestazioni. Il rendering viene comunque eseguito in una bitmap fuori schermo, pertanto l'utilizzo del doppio buffering porta a una copia aggiuntiva senza alcun vantaggio su tali sistemi. Quindi, a meno che VCL non sia abbastanza intelligente da ignorare il doppio buffering in quel caso (non so se lo farà, dovrebbe controllare) potrebbe essere meglio non impostarlo incondizionatamente.

Edit:

Ho controllato, e in entrambi Delphi 2007 e Delphi 2009 il metodo TWinControl.WMPaint non usa il doppio buffer quando DwmCompositionEnabled rendimenti True. Bello.

25

Il doppio buffering deve essere evitato quando si esegue Desktop remoto di qualche tipo, poiché l'intera bitmap del controllo/modulo deve essere inviata in rete per eseguire BitBlt. vedi this blog post ...

+3

+1 Impressionante. È così ovvio nel momento in cui lo fai notare, ma non mi era mai venuto in mente che sarebbe stato così. Questo mi indurrà a ripensare ad alcuni dei miei programmi .... grazie per avermelo fatto notare! – robsoft

+0

+1 concorda con quanto menzionato sopra! – user271077

1

È inoltre possibile creare un esperto in fase di progettazione che imposta automaticamente questo valore per ogni forma/controllo creato, anziché derivare nuovi controlli per tutti quelli esistenti che richiederebbero molto più lavoro. Vedere il codice sorgente su GExperts.org per avere un'idea di come ottenere ciò.

Problemi correlati