Как повысить производительность растровой прокрутки на Mac? - PullRequest
1 голос
/ 25 февраля 2010

У меня есть игра с большой растровой картой

Теперь мы используем JPEG (4900x4200)

И во время игры нам нужно прокрутить эту карту.

Мы используем следующее:

Карта классов расширяет mx.containers.Canvas

и mx.controls.Image на нем

В конструкторе имеем:

public function Map() {
        super();
        image.source = ResourceManager.interactiveManager.map;//big image
        addChild(image);
......
}

для прокрутки мы используем:

    if(parentAsCanvas==null){
        parentAsCanvas = (parent as Canvas);
    }

    parentAsCanvas.verticalScrollPosition = newX;
    parentAsCanvas.horizontalScrollPosition = newY;

В Windows у нас очень хорошая производительность. В Linux и Mac во flashplayer у нас тоже хорошая производительность.

Но в браузерах производительность довольно низкая! Что мы можем сделать, чтобы решить это?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Это медленно, потому что вы все время визуализируете большое изображение.

Вот несколько вещей, которые приходят мне в голову:

  • Попробуйте использовать свойство scrollRect в объекте Bimtap, содержащем ваше изображение BitmapData, для отображения только видимой области, а затем используйте scrollRect x и y для перемещения в новую область
  • Попробуйте использовать BitmapData размером видимой области и используйте copyPixels () , чтобы получить правильную область для отображения, снова используя прямоугольник
  • Попробуйте использовать BitmapData.scroll ()

Вот несколько фрагментов:

scrollRect:

//assuming map is BitmapData containing your large image
//100x100 is a test scroll area
var scroll:Rectangle = new Rectangle(0,0,100,100);
var bitmap:Bitmap = new Bitmap(map);
bitmap.scrollRect = scroll;
addChild(bitmap);

this.addEventListener(Event.ENTER_FRAME, update);
function update(event:Event):void{
    scroll.x = mouseX;
    scroll.y = mouseY;
    bitmap.scrollRect = scroll;
}

copyPixels:

var scroll:Rectangle = new Rectangle(0,0,100,100);
var scrollPoint:Point = new Point();
var map:BitmapData = new Map(0,0);
var bitmap:Bitmap = new Bitmap(new BitmapData(100,100,false));
bitmap.bitmapData.copyPixels(map,scroll,scrollPoint);
addChild(bitmap);

this.addEventListener(Event.ENTER_FRAME, update);
function update(event:Event):void{
    scroll.x = mouseX;
    scroll.y = mouseY;
    bitmap.bitmapData.fillRect(scroll,0xFFFFFF);
    bitmap.bitmapData.copyPixels(map,scroll,scrollPoint);
}

Не идеально, но это должно дать вам представление

НТН, George

0 голосов
/ 16 марта 2010

Я прочитал следующую статью http://www.insideria.com/2008/04/flex-ria-performance-considera.html

Я и я нашли решение моей проблемы.

Если я открою свой SWF-файл в браузере как "http://host/myswf.swf", у меня огромная потеря производительности в браузере, как причина работы LaoyoutManager, который пересчитывает позиции и размеры всех полотен в приложении. И этот процесс съедает более 60 % производительности. (Да, у нас много приложений в нашем приложении).

И когда я поместил свое приложение в html-блок постоянного размера на html-странице, все проблемы исчезли! У меня увеличение производительности на 80%!

...