7

次のコードがあります。

this.getGame().getGraphics().drawBitmap(Assets.playScreen_LaserBeamAnimation, new Rect(0, 0, 100, 750), new Rect(0, 0, 100, 750), null);
this.getGame().getGraphics().drawBitmap(Assets.playScreen_LaserBeamAnimation, new Rect(0, 200, 10, 800), new Rect(0, 0, 200, 600), null);

最初の render ステートメントはレンダリング0.6 - 1 secondに時間がかかります。2番目の周り1 millisecond​​。

ビットマップは大きく968 KB、次のコードでロードされます:

public Bitmap readAssetsBitmap(String filename) throws IOException {
        try {
            BitmapFactory.Options options = new BitmapFactory.Options(); 
            options.inPurgeable = true;
            Bitmap bitmap = BitmapFactory.decodeStream(assets.open(filename), null, options);
            if(bitmap == null) {
                WSLog.d(Game.GAME_ENGINE_TAG, this,"File cannot be opened: It's value is null");
                throw new IOException("File cannot be opened: It's value is null");
            }
            else {
                WSLog.d(Game.GAME_ENGINE_TAG, this,"File successfully read: " + filename);
                return bitmap;
            }
        } 
        catch (IOException e) {
            WSLog.d(Game.GAME_ENGINE_TAG, this,"File cannot be opened: " + e.getMessage());
            throw new IOException("File cannot be opened: " + e.getMessage());
        }

    }

画像の読み取りとビットマップの設定には時間がかかると思いますが、その小さな領域のレンダリングにはそれほど時間がかかりません (不思議なことに、それは最初のレンダリング呼び出しにすぎません)。

最初のレンダリングに時間がかからないようにするにはどうすればよいですか?

注意: スケーリングを行う必要はありません (私は信じています)。

4

2 に答える 2

0

すべてのフレームを含む大きなビットマップを使用してアニメーションを描画しようとしているようです。その場合、画像の縮小はおそらくうまくいきません。

ただし、画像に n 個の個別のフレームがある場合、画像を読み込むときに n 個のビットマップを作成しArrayList<Bitmap>、アプリの読み込み時にそれらを に保存してみませんか? そうすれば、画像をプレチョップすることができ、レンダリング時に画像をスライスすることを心配する必要がなくなります。

レンダリング時に、現在のビットマップを描画したいものに置き換えるか、スケーリングせずにその場で画像を描画できます(スケーリングを使用して描画するよりもはるかに高速です)。

これにはより多くのメモリが必要になる場合がありますが、おそらく顕著なスピードアップが見込めます。


更新:なぜそんなに遅いのかについて。Java グラフィックスは本当に馬鹿げています。私の推測では、最初の例 (長い例) では、領域が同じ縮尺であることがわかると、大きな画像全体を反復処理し、その特定の領域にあるピクセルを見つけるたびに、それを描画します宛先地域。

高速描画では、縮尺が異なることがわかり、逆方向に描画されると思います。宛先領域のすべてのピクセルについて、元の画像でどのピクセルを参照するかを判断し、それに応じてその正方形にブレンドします。

宛先領域のピクセル数がはるかに少ないため、アルゴリズムははるかに高速です。

Java.Graphics は本当に悪いです。他のサードパーティの画像処理ライブラリを調べましたか?

于 2013-05-12T19:14:13.870 に答える