0

そこでは複数のフォルダーを使用できるため、drawable フォルダーの代わりに assets フォルダーを使用するのが好きです (9 パッチでない場合)。ただし、ドローアブルを取得するために使用する方法では、CPU がかなり静かにする必要がありました。例: 10 個の ImageView を追加すると、10% の CPU が必要になります (私は Android Assistent と Samsung TouchWiz TaskManager を使用しています)。ゲームを書いている間は気がつきませんでした。そして今、このゲームはフォアグラウンドでなくても 40 ~ 100% の CPU を必要とします。

これが、ドローアブルを作成するために使用する方法です。

public BitmapDrawable readAsset(path){
    try{

        inputStream = assetManager.open(path);
        //get the Bitmap
        desiredImg = BitmapFactory.decodeStream(inputStream, null, opts);
        //resize for other screen sizes (scale is calculated beforehand)
        scaleX =(int)(desiredImg.getWidth()/scale);
        scaleY = (int)(desiredImg.getHeight()/scale);

        //Bitmap to get config ARGB_8888 (createScaledBitmap returns RGB_565 => bad quality especially in gradients)
        //create empty bitmap with Config.ARGB_8888 with the needed size for drawable
        Bitmap temp = Bitmap.createBitmap(scaleX, scaleY, Config.ARGB_8888);
        //Canvas to draw desiredImg on temp
        Canvas canvas = new Canvas(temp);
        canvas.drawBitmap(convert, null, new Rect(0, 0, scaleX, scaleY), paint);

        //Convert to BitmapDrawable
        BitmapDrawable bitmapDrawable=new BitmapDrawable(temp);
        bitmapDrawable.setTargetDensity(metrics);

        inputStream.close();
        return bitmapDrawable;
    }catch (Exception e) {
        Log.d(TAG, "InputStream failed: "+e.getMessage());
    }
    return null;
}

アプリで行う唯一のことは、このメソッドを使用して RelativeLayout にいくつかの ImageView を追加することです。

private void addImageToContainer(int paddingLeft, int paddingTop) {
    ImageView imageView = new ImageView(this);
    imageView.setImageDrawable(assetReader.readAsset("test.jpg"));
    imageView.setPadding(paddingLeft, paddingTop, 0, 0);
    container.addView(imageView);
}
4

1 に答える 1

1

おそらく最善の方法は、 traceviewを使用して実行をプロファイリングすることです。これにより、アプリが実行時間のほとんどを費やしている場所を完全に理解できるようになります。その後、その特定のコードの最適化に集中できます。

経験に基づいた推測ですが、無駄な実行の大部分は、assets/リソースの代わりに画像を引き出すためではなく、後で行われるすべてのスケーリング作業のためだと感じています (そして、見た目からすると、これがすべてです)。メインスレッドで実行されるため、同時実行性について言及する必要はありません)。

アセットをデコードするときに利用できるBitmapFactory.Options(ドキュメント リンク)の一部を活用することをお勧めします。inScaled特に、 、inDensity、およびinTargetDensityオプションを組み合わせて、必要なすべてのスケーリングを実行できるはずです。これらをメソッドに渡すと、decodeStream()戻る前に画像のサイズ変更に使用される後続のコードをすべて削除できる可能性があります。

于 2012-02-02T20:17:23.920 に答える