在新线程中将Bitmap加载到变量,OpenGL会产生白色图像

时间:2014-02-24 05:03:57

标签: android multithreading image opengl-es bitmap

我正在尝试在新线程中加载图像以减少UI线程中的延迟:

public class MyGame extends Activity implements Game, Renderer {
    ...
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        super.onSurfaceCreated(gl, config);
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                if(firstTimeCreate) {
                    Settings.load(getFileIO());
                    // Load bitmaps and save to variable Assets.backgroundRegions
                    Assets.load(this);
                    firstTimeCreate = false;
                } else {
                    Assets.reload();
                }
            }
        });
        t.start();
    }
    ...
}

问题是当我在加载图像时尝试绘制图像时,我只获得白色图像,没有错误信息。这是我用来渲染背景的方法(这个方法在循环中运行)

public void renderBackgrounds() {
    if (Assets.backgroundRegions.size() > 0) {
        batcher.beginBatch(Assets.backgroundRegions.get(0).texture);
        batcher.drawSprite(
            Assets.backgroundRegions.get(0).position, 
            Assets.backgroundRegions.get(0)
        );
        batcher.endBatch();
    } // else { background is not loaded yet }
}

奇怪的是当我按Home键并再次打开我的应用程序时,所有背景图像都会正确显示。就像所有加载的图像都有“白图缓存版本”一样,Android只是在重新创建活动之前不清除缓存,也许,我不知道。

如果我在onSurfaceCreated中删除新的线程实现,如下所示:

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        super.onSurfaceCreated(gl, config);
        if(firstTimeCreate) {
            Settings.load(getFileIO());
            Assets.load(this);
            firstTimeCreate = false;
        } else {
            Assets.reload();
        }
    }

...然后一切正常,除了UI线程非常滞后。

我已经阅读了一些关于在新线程中加载位图的帖子(例如thisthis),他们加载Bitmap并将变量直接分配给View(ImageView),但在我的情况下,我保存了将Bitmap转换为变量并使用OpenGL进行渲染。我不知道这是否是其中一个原因。

我可以考虑

  • 所有已加载的图片缓存错误(不知何故,我不知道),我只获得白色图片,直到重新创建活动
  • 多线程错误,变量我用来存储位图数据(backgroundRegions)。
  • 当我一起使用 OpenGL和多线程时,我做错了事,我对OpenGL知之甚少,OpenGL的部分来自一个小框架。

0 个答案:

没有答案