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 = 空;

  • 最后,我也可以,只是不回收位图,但这不是一个选项

注意 我需要以这种方式访问​​位图,而不是使用 BitmapFactory,因为我通过 XML 别名访问它。

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 回答