Niekończące się powtarzające się przewijane tło

Mam problem z AS3 i AIR. Pracuję nad grą z przewijaniem bocznym dla smartfonów z samolotem i używam różnych środowisk jako warstw.

Przed wszystkimi innymi: używam GPU i tylko bitmapy, jakość jest ustawiona na niską. Tak więc ustawienia wydajności są ustawione na używanie smartfona.

Umieściłem je w prostokącie używając API rysowania i przesunąłem tło za pomocą macierzy:

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);
}

UPDATE2 (

Popatrz na to:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/

Użyłem tego do stworzenia tła.

Dzięki temu mogę symulować, że mój samolot leci w prawo bez przesuwania całego tła i mogę użyć małej pojedynczej grafiki, która powtarza się za każdym razem (dla warstwy pierwszego planu).

Do warstwy tła używam również tej metody, ale ze znacznie większą grafiką i poruszam ją tylko z mniejszą prędkością mojej płaszczyzny, aby symulować odległe tło.

Moja metoda przeniesienia dotyczy zdarzenia typu Enterframe. Mogę więc aktualizować tło każdej klatki „ruchem” mojego samolotu.

)

Samolot może przekroczyć wysokość bitmap. Za każdym razem, gdy bitmapa wraca do okna / ekranu, występuje prawdziwe długie opóźnienie. A kiedy samolot leci bardzo szybko, gra też zaczyna się opóźniać.

Moim pierwszym podejściem było użycie plików .PNG (ale są bardzo duże: rozmiar 1-3 MB). Moim następnym podejściem było użycie plików .GIF (znacznie mniejszy rozmiar).

Oba są takie same. Więc tak nie może być.

Czytałem o draw () i copyPixels (), ale nie wiem, jak mogę ich użyć do powtórzenia obrazu.

AKTUALIZACJA1:

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);
}