Dices que los ejemplos que incluye Embarcadero funcionan más suavemente. ¿Las has comparado con tu código, a ver qué diferencias hay?
De todas formas, y adivinando, aquí te dejo algunas pistas que podrían ayudar (o no).
Por lo que dices, la construcción en capas de lo que se muestra en pantalla es así:
Código:
TForm
TPanel
TScrollBox
TImage
Cada vez que tiene que actualizar la pantalla, se llama al método Draw de TForm, que llama al método Draw de TPanel, que llama al método Draw de TScrollBox, que llama al método Draw de TImage.
Además, cada vez que dibuja el TImage hace una interpolación para el
zoom, comprobando también los límites dentro de TScrollBox, que comprueba los límites también en el TPanel (aunque no sé si con alineación al área cliente optimiza algo). Y aún queda el tema de que TImage almacena la imagen completa, sin pérdida ni adaptándola al dispositivo (número de colores, tamaño, etc.), por lo que es posible que deba hacerse alguna conversión cada vez que se dibuja. Dependiendo de la implementación de los componentes (que desconozco) es posible que muchas de estas comprobaciones, interpolaciones y conversiones las haga por cada pixel de forma independiente. Si es así, normal que vaya a saltos, ya que cada parte hay que multiplicarla por el número de píxels de la imagen.
Para realizar animaciones complejas, te recomiendo dos opciones:
- Buscar un componente específico que haga dicha animación, ya que suele optimizar el proceso. Posiblemente es lo que hacen en los ejemplos de Embarcadero (no los he visto, así que estoy adivinando).
- Hacer tú el trabajo, usando como "lienzo" un componente óptimo para mostrar gráficos rápidamente. Por ejemplo, un componente que use OpenGL (OpenGL ES, en este caso concreto).