0

私のアプリは、建物の平面図を読み込んでから、平面図にオブジェクト (家具) を描画する必要があります。フロアプラン イメージは 2500 x 1500 240Kb PNG ですが、ビットマップを作成するために 12Mb 以上のヒープを必要とするため、ビットマップ ファクトリーがほとんどのデバイスをクラッシュさせ、OutOfMemory エラーが発生します。ここで明確にさせてください: これは、私が知る限り、メモリ リークではなく、最初のイメージの作成中に最初にクラッシュするため、 bitmap.recycle() は何もしません。画像を認識できないほどのサンプル サイズを使用しない限り、inSampleSize を使用して画像を読み取っても役に立ちません。この全体の状況はクレイジーです。Droid 3、HTC Inspire、および 2 つの 2.3 エミュレーターでテストしています。HTC は、128Mb の (ばかげた) ヒープ サイズを持つエミュレーターと同様に、マップをロードします。このアプリの展開は、さまざまな Android ユーザーに使用されるため、

これが私の現在のコードで、使用できない画像が表示されます(別のSO投稿から、申し訳ありませんがリンクを失いました):

BitmapFactory.Options o=new BitmapFactory.Options();
        o.inJustDecodeBounds=true;
        BitmapFactory.decodeResource(getResources(), resourceId, o);


        //Find the correct scale value. It should be the power of 2.
        int scale=16;
        while((o.outWidth/scale)>=REQUIRED_SIZE || (o.outHeight/scale)>=REQUIRED_SIZE)
            scale*=2;

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = scale;

        Bitmap base_image;
        try {
            base_image = BitmapFactory.decodeResource(getResources(), resourceId);
        } catch (Error e1) {
            base_image = BitmapFactory.decodeResource(getResources(), resourceId, options);
        }

GLSurfaceView はここで私の問題を解決しますか? 1) フロアプラン イメージを読み込む、2) オブジェクトとテキスト ラベルをプログラムで描画できるようにする、3) ズームをサポートし、フロアプランの座標に基づいてタッチに反応するために必要です。これが答えである場合、このような基本的な 2D 作業のための優れたチュートリアルを推奨できる人はいますか?

4

1 に答える 1

0

ビットマップのメモリ使用量を減らす方法はたくさんあります。openGL を使用することを選択した場合は、ビデオ メモリに直接送信できる圧縮済みのテクスチャを使用できます。Android は ETC1 テクスチャをネイティブでサポートしています。私の記憶が正しければ、ETC はサイズを 25% 縮小します。ただし、openGL の経験がなく、テキストの描画などの少し複雑なアクションを実行する必要があるため、これは最適なアクションではない可能性があります (ただし、この方法を使用すると、古いデバイスで最高のパフォーマンスが得られる可能性があります)。 . そこにあるエンジンのいずれかを使用することを検討できます (AndEngine または Box2d が一般的です)。

より速く、おそらくより良いオプションは、フロア プランのベクトル表現 (SVGファイルなど) を作成することです (これは、背景色と壁の線で構成される単純なプランがある場合に可能です)。Pathさらに高度な画像が必要な場合は、クラスまたは外部ライブラリを使用してこれを描画します。

于 2012-06-12T16:58:13.433 に答える