0

リソース画像ファイルをロードしてそれらのテクスチャを作成するAndroidアプリケーションを持っているので、OpenGLを使用してレンダリングできます。ただし、私はミップマップを使用しており、画像のサイズは 2 の累乗でなければなりません。これが、テクスチャを作成する前に、指定されたビットマップの幅または高さを増やす必要がある理由です。

現在作業を行っている私のコードは次のとおりです。

    Bitmap bitmap = BitmapFactory.decodeResource(this.context.getResources(), resourceId);

    Bitmap newBitmap = Bitmap.createBitmap(nextPowerOfTwo(bitmap.getWidth()), 
            nextPowerOfTwo(bitmap.getHeight()), bitmap.getConfig());

    int x=0,y=0,width=bitmap.getWidth(),height=bitmap.getHeight();
    int [] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, x, y, width, height);
    newBitmap.setPixels(pixels, 0, width, x, y, width, height);
    bitmap.recycle();
    gl.glGenTextures(1, textures, textureCount);
            ...

これは、Asus TF101 と Nexus 4 では完全に機能しましたが、次の行で、Galaxy S3 (およびおそらくより多くのデバイス) で OutOfMemory 例外が発生しています。

int [] pixels = new int[width * height];

いくつかの読み取りを行うと、Bitmap.createBitmap の呼び出しもメモリを消費することがわかりました。メモリの無駄を減らす方法を考えようとしています。頭に浮かぶ最初のアイデアは、「int[] ピクセル」に小さい 2D 配列を使用し、一度にコピーするピクセルを少なくすることです。しかし、これを行うための他のより効率的な方法があるかどうか疑問に思っています。

4

1 に答える 1

1

スケーリングされたビットマップを作成しているだけなので、このメソッドが問題の解決策になるはずです: http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap , int, int 、ブール値)

Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, nextPowerOfTwo(bitmap.getWidth()), nextPowerOfTwo(bitmap.getHeight()), false);
bitmap.recycle();
于 2013-08-18T17:55:41.820 に答える