Из 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();
}
}
И вот почему движок зависает и пользовательский интерфейс застревает.Можно отобразить экран загрузки, пока текстуры загружаются в аппаратные средства, без остановки, скажем, ProgressBar
.Это не просто и требует много кода, но это возможно и не требует сумасшедших хаков, просто логика.
Вам необходим менеджер ресурсов (RM) и Scene Manager (SM) , которые работают вместе (с AsyncTasks
) и отвечают за загрузку текстур для текущей сцены.Поскольку у вас BaseGameActivity
, вы можете использовать этот экземпляр Activity
, чтобы отобразить полноэкранный Dialog
с индикатором выполнения.Логика такова:
- SM просят показать Сцена A
- SM показывает загрузку
Dialog
- SM асинхронно сообщает RMзагрузить все ресурсы Scene A в аппаратные средства (для каждой текстуры для сцены A, texture.load)
- RM "onSceneTexturesLoadComplete" сообщает SM, что все текстуры загружены
Так как texture.load не гарантирует, что текстура действительно загружена, вам нужно иметь TryToDismissDialog
, который расширяет TimerTask
.Время от времени TryToDismissDialog
запрашивает текстуры Scene A и проверяет, действительно ли они загружены:
if (texturePack.getTexture().isLoadedToHardware()) {
texturesLoaded++;
}
Если все текстуры загружены, вы отклоняете Dialog
и вуаля, вы увидите, что Сцена готова.
Надеюсь, это поможет
ps: на самом деле это включает в себя несколько строк кода, я только что разместил здесь быстрые шаги / руководство / псевдокод.Я не буду публиковать окончательное решение, потому что оно довольно тяжелое и «связано с проектом».