2009-12-23 16 views
7

Tengo un programa antiguo escrito en borland pascal y en Delphi si uso las funciones Form1.Canvas.LineTo y MoveTo obtengo un efecto parpadeante. ¿Alguien puede decirme cómo deshacerse del parpadeo?dejar de parpadear

gracias

Respuesta

13

una técnica general para reducir el parpadeo en las operaciones de gráficos animados se llama double buffering. La idea es que dibujes todo en un mapa de bits fuera de pantalla, y cuando hayas terminado de renderizar toda la escena, copia todo el mapa de bits en la pantalla visible.

El término también se refiere a técnicas soportadas por hardware como la capacidad de intercambiar el entero buffer de visualización de video con uno alternativo, que se usa en sistemas dedicados como videojuegos de consola.

20

Intente establecer DoubleBuffered en true en Form.OnCreate.

+12

Cuando era un chaval joven, tuvimos que implementar doble buffer nosotros mismos. ¡Cuesta arriba en ambos sentidos, en la nieve! –

+0

@Greg: OTOH esto ha sido respaldado por Delphi VCL durante más de 10 años, por lo que en realidad hay pocos incentivos para resolverlo. +1 para esta respuesta, es la forma Delphi de hacer doble buffering. – mghie

+5

@Greg: Descalzo? – HMcG

3

Aunque el doble buffering suele ser la mejor solución, no siempre es la solución correcta, y definitivamente no es la solución más ahorradora de memoria. Sin embargo, si solo dibuja una parte de la imagen, iría con esa solución y establecería DoubleBuffered en true como se menciona en los otros comentarios.

Sin embargo, si llena toda el área de componentes cada vez que dibuja de todos modos, es posible que desee elegir un enfoque diferente. Si configura el ControlStyle en csOpaque, evitará que el componente borre el fondo y, por lo tanto, elimine una fuente del parpadeo, sin tener que duplicar el búfer. Esto, por supuesto, requiere que dibujes en toda el área del componente, por lo que la solución solo es realmente adecuada si lo haces.

En general, sin embargo, si el consumo de memoria no es importante, yo también buscaría el doble buffer, solo quería ofrecerte una alternativa. :)

4

Ejemplo de código fácil en el doble almacenamiento en búfer.

Crear Buffer (TBitmap)

Dibujar en el lienzo de búfer.

Dibuje el mapa de bits en el lienzo. Form1.Canvas por ejemplo.

Buffer := TBitmap.Create; 
try 
    Buffer.Width:=Form1.Width; 
    Buffer.Height:=Form1.Height; 
    //clearBuffer 
    Buffer.Canvas.FillRect(Buffer.Canvas.ClipRect); 
    //draw Something 
    Buffer.Canvas.TextOut(0,0,'Hello World'); 
    Buffer.Canvas.Rectangle(0,1,2,3); 
    //drawBuffer on canvas 
    Form1.Canvas.Draw(0,0,Buffer); 
finally 
    Buffer.free 
end; 
Cuestiones relacionadas