2

OpenGLES 2.0 アプリでテクスチャとして使用するビットマップを読み込んでいます

Bitmapfactory経由でビットマップを読み込んで使用すると、すべて問題ありません。そのようです:

ロード

 public void loadBitmaps{

    backgrounds= BitmapFactory.decodeResource(view.getResources(), R.drawable.backgrounds, BMFOptions);
    ...

使用する

//Apply as texture to OpenGL Quad

リサイクル

backgrounds.recycle();

.

さて、問題は…………

.

ビットマップを bitmapDrawable としてロードすると、問題が発生します (以下のコードで説明)。そのようです:

.

クラス レベルで BitmapDrawable を宣言する

public class Res{

    BitmapDrawable bd;
    ...

ロード

public void loadBitmaps(){

    bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);
    backgrounds = bd.getBitmap();
    ...

使用する

//Apply as texture to OpenGL Quad

リサイクル

backgrounds.recycle();

これを行うと、最初は機能しますが、もう一度押して終了し、アプリを再起動すると、テクスチャが表示されず、黒いクワッドしか表示されません。

次のいずれかを実行すると問題が解決します。その理由を知りたいのですが......

  • クラス変数からbdの宣言を移動して、次を使用しています。

BitmapDrawable bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);

  • または、ビットマップを作成した後にこれを行うだけです。

bd = ヌル;

  • 最後に、ビットマップをリサイクルしないこともできますが、これはオプションではありません

XML エイリアス経由でビットマップにアクセスしているため、BitmapFactory を使用するのではなく、この方法でビットマップにアクセスする必要があることに注意してください。

4

1 に答える 1

3

Drawableインスタンスはキャッシュされて共有されるため、それを呼び出すとgetDrawable()、新しいビットマップを作成するのではなく、現在キャッシュされているインスタンスが読み込まれます。基になるビットマップをリサイクルすると、将来の使用で問題が発生します。おそらくやりたいことは、変更する前にドローアブルのコピーを作成することです:

BitmapDrawable bmpDrawable = (BitmapDrawable) view.getResources()
        .getDrawable(R.drawable.backgrounds);
Bitmap original = bmpDrawable.getBitmap();
Bitmap copy = original.copy(original.getConfig(), true);

ドローアブル ミューテーションの詳細については、このブログ投稿を参照してください。

于 2014-09-15T23:29:17.863 に答える