在AndEngine中加载纹理时的进度条

时间:2012-01-20 05:55:08

标签: android andengine

当我开始游戏时,黑屏会出现一段时间,因为正在加载资源。 我仔细阅读了一个教程,该教程展示了如何显示进度条,同时引导我遵循的资源,现在我可以看到进度条。但问题是当进度条可见时,其他所有东西都停止了。没有任何反应。只有黑屏和进度条。任何人都可以告诉我为什么每件事都被暂停以及为什么loadresources和loadscene方法不起作用?请提供解决方案。

2 个答案:

答案 0 :(得分:0)

您需要在工作线程中加载资源。这样做的一个很好的实用工具是AsyncTask。指南主题Processes and Threads说明了为什么需要这样的内容,以及示例代码,说明如何执行可能正是您需要的简单AsyncTask

答案 1 :(得分:0)

来自Engine.java:

public void onDrawFrame(final GLState pGLState) throws InterruptedException {
        final EngineLock engineLock = this.mEngineLock;

        engineLock.lock();
        try {
            engineLock.waitUntilCanDraw();

            this.mVertexBufferObjectManager.updateVertexBufferObjects(pGLState);
            this.mTextureManager.updateTextures(pGLState);
            this.mFontManager.updateFonts(pGLState);

            this.onUpdateDrawHandlers(pGLState, this.mCamera);
            this.onDrawScene(pGLState, this.mCamera);

            engineLock.notifyCanUpdate();
        } finally {
            engineLock.unlock();
        }
    }

这就是引擎挂起并且UI卡住的原因。当纹理被加载到硬件中时,可以显示加载屏幕,而不会冻结,例如ProgressBar。这并不容易,需要大量的代码,但它可能并且不需要疯狂的黑客,只需要一些逻辑。

您需要有一个资源管理器(RM)和一个场景管理器(SM),他们一起工作(使用AsyncTasks)并负责加载当前场景的纹理。由于您有BaseGameActivity,因此可以使用此Activity实例显示带有进度条的全屏Dialog。逻辑是:

  1. 要求SM显示场景A
  2. SM显示加载Dialog
  3. SM异步告诉RM将所有场景A 资源加载到硬件中(对于场景A的每个纹理,texture.load)
  4. RM“onSceneTexturesLoadComplete”告诉SM所有纹理都已加载
  5. 由于texture.load不保证实际加载纹理,因此您需要TryToDismissDialog扩展TimerTask。此TryToDismissDialog会不时查询场景A 纹理并检查它们是否实际加载:

    if (texturePack.getTexture().isLoadedToHardware()) {
            texturesLoaded++;
    }
    

    如果加载了所有纹理,则关闭Dialog,然后您将看到场景准备就绪。
    希望它有助于

    ps:这实际上涉及一些代码行,我刚刚在这里发布了一个快速步骤/指南/伪代码。我不会发布最终的解决方案,因为它很重,而且“项目相关”。