1

大きなラスターマップを使ったゲームがあります

現在、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でも、パフォーマンスは良好です。

しかし、ブラウザのパフォーマンスはかなり遅いです!それを解決するために何ができるでしょうか?

4

2 に答える 2

3

常に大きな画像をレンダリングしているため、時間がかかります。

これが私の頭に浮かぶいくつかのことです:

  • 画像BitmapDataを保持しているBimtapオブジェクトでscrollRectプロパティを使用して表示領域のみを表示してから、scrollRectxおよび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);
}

完璧ではありませんが、それはあなたにアイデアを与えるはずです

HTH、ジョージ

于 2010-02-25T14:47:50.513 に答える
0

私は次の記事を読みましたhttp://www.insideria.com/2008/04/flex-ria-performance-considera.html

私と私は自分の問題の解決策を見つけました。

ブラウザでSWFを「http://host/myswf.swf」として開くと、アプリケーション内のすべてのキャンバスの位置とサイズを再計算するLaoyoutManagerが機能する理由として、ブラウザのパフォーマンスが大幅に低下します。そして、そのプロセスはパフォーマンス容量の60%以上を消費します(はい、アプリケーションには多くのCanvasがあります)。

そして、アプリケーションをhtmlページのcontant-size htmlブロックに配置すると、すべての問題が解消されました。パフォーマンスが80%向上しました。

于 2010-03-16T10:21:57.987 に答える