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
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
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.
Intente establecer DoubleBuffered en true en Form.OnCreate.
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. :)
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;
Cuando era un chaval joven, tuvimos que implementar doble buffer nosotros mismos. ¡Cuesta arriba en ambos sentidos, en la nieve! –
@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
@Greg: Descalzo? – HMcG