当我开始游戏时,黑屏会出现一段时间,因为正在加载资源。 我仔细阅读了一个教程,该教程展示了如何显示进度条,同时引导我遵循的资源,现在我可以看到进度条。但问题是当进度条可见时,其他所有东西都停止了。没有任何反应。只有黑屏和进度条。任何人都可以告诉我为什么每件事都被暂停以及为什么loadresources和loadscene方法不起作用?请提供解决方案。
答案 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
。逻辑是:
Dialog
由于texture.load不保证实际加载纹理,因此您需要TryToDismissDialog
扩展TimerTask
。此TryToDismissDialog
会不时查询场景A 纹理并检查它们是否实际加载:
if (texturePack.getTexture().isLoadedToHardware()) {
texturesLoaded++;
}
如果加载了所有纹理,则关闭Dialog
,然后您将看到场景准备就绪。
希望它有助于
ps:这实际上涉及一些代码行,我刚刚在这里发布了一个快速步骤/指南/伪代码。我不会发布最终的解决方案,因为它很重,而且“项目相关”。