Fondo de desplazamiento de repetición sin fin

Tengo un problema con AS3 y AIR. Estoy trabajando en un juego de desplazamiento lateral para teléfonos inteligentes con un avión y uso diferentes fondos como capas.

Antes que nada: utilizo GPU y solo mapas de bits, la calidad se establece en baja. Así que la configuración de rendimiento está configurada para el uso de teléfonos inteligentes.

Los coloqué en un rectángulo usando la API de dibujo y moví el fondo con una matriz:

protected var scrollingBitmap:BitmapData;
protected var canvas:Graphics;
protected var matrix:Matrix;

public function move(dx:Number, dy:Number):void {
    matrix.translate(dx, dy);
    if(dx != 0) matrix.tx %= scrollingBitmap.width;
    if(dy != 0) matrix.ty %= scrollingBitmap.height;
    drawCanvas();
}

protected function drawCanvas():void {
    canvas.clear();
    canvas.beginBitmapFill(scrollingBitmap, matrix, true, true);
    canvas.drawRect(0, -scrollingBitmap.height, 1404, scrollingBitmap.height);
}

ACTUALIZACIÓN2 (

Mira esto:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/

Utilicé esto para crear mis fondos.

Con esto puedo simular que mi avión está volando hacia la derecha sin mover todo el fondo y puedo usar un pequeño gráfico que se repite cada vez (para la capa de primer plano).

Para la capa de fondo también utilizo este método, pero con un gráfico mucho más grande y lo muevo solo con menos velocidad de mi avión para simular un fondo lejano.

Mi método de movimiento está en un evento enterframe. Así que puedo actualizar el fondo de cada cuadro con el "movimiento" de mi avión.

)

El plano puede superar la altura de los mapas de bits. Cada vez que el mapa de bits vuelve a aparecer en la ventana / pantalla, se produce un gran retraso real. Y cuando el avión vuela muy rápido, el juego también comienza a retrasarse.

Mi primer enfoque fue usar archivos .PNG (pero son muy grandes: tamaño de 1-3MB). Mi siguiente enfoque fue usar archivos .GIF (mucho menos tamaño).

Con ambos es lo mismo. Entonces no puede ser eso.

Leí sobre draw () y copyPixels () pero no sé cómo puedo usarlos para repetir la imagen.

ACTUALIZACIÓN1:

protected var scrollingBitmap:BitmapData;
protected var canvas:Bitmap;

protected function init(e:Event):void {
    removeEventListener(Event.ADDED_TO_STAGE, init);
    canvas = new Bitmap(new BitmapData(1404, scrollingBitmap.height, true), "auto", true);
    this.addChild(canvas);
    drawCanvas();
}

public function move(dx:Number, dy:Number):void {
    if(dx != 0) dx %= scrollingBitmap.width;
    if(dy != 0) dy %= scrollingBitmap.height;
    drawCanvas(dx, dy);
}

protected function drawCanvas(xPos:Number = 0, yPos:Number =  0):void {
    canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, 1404, scrollingBitmap.height), new Point(xPos, yPos), scrollingBitmap);
}