【发布时间】:2014-07-25 22:42:18
【问题描述】:
当我开始我的游戏时黑屏会出现一段时间,因为正在加载资源。 我仔细阅读了一个教程,该教程展示了如何在引导资源的同时显示进度条,现在我可以看到进度条了。但问题是当进度条可见时,其他一切都停止了。什么也没有发生。只有黑屏和一个进度条就可以了。谁能告诉我为什么每件事都被暂停以及为什么 loadresources 和 loadscene 方法不起作用?请提供解决方案。
【问题讨论】:
当我开始我的游戏时黑屏会出现一段时间,因为正在加载资源。 我仔细阅读了一个教程,该教程展示了如何在引导资源的同时显示进度条,现在我可以看到进度条了。但问题是当进度条可见时,其他一切都停止了。什么也没有发生。只有黑屏和一个进度条就可以了。谁能告诉我为什么每件事都被暂停以及为什么 loadresources 和 loadscene 方法不起作用?请提供解决方案。
【问题讨论】:
您需要在工作线程中加载资源。一个很好的实用工具是AsyncTask。指导主题 Processes and Threads 解释了为什么需要这样的东西,以及示例代码显示如何执行简单的 AsyncTask,这可能正是您所需要的。
【讨论】:
来自 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。这并不容易,需要大量代码,但它是可能的,不需要疯狂的 hack,只需要一些逻辑。
您需要有一个 Resources Manager (RM) 和一个 Scene Manager (SM) 一起工作(与AsyncTasks)并负责加载纹理对于当前场景。由于您有一个BaseGameActivity,您可以使用这个Activity 实例来显示带有进度条的全屏Dialog。逻辑是:
Dialog
由于 texture.load 不能保证纹理已实际加载,您需要有一个扩展 TimerTask 的 TryToDismissDialog。这个TryToDismissDialog 不时会查询Scene A纹理并检查它们是否实际加载:
if (texturePack.getTexture().isLoadedToHardware()) {
texturesLoaded++;
}
如果所有纹理都已加载,您将关闭 Dialog,然后您将看到场景准备就绪。
希望对您有所帮助
ps:这实际上涉及一些代码行,我刚刚在这里发布了一个快速步骤/指南/伪代码。我不会发布最终解决方案,因为它非常繁重且“与项目相关”。
【讨论】: