Android 从排行榜返回时,主活动暂停几秒钟(由于重新加载纹理)
我的应用程序只有一个活动 当我启动我的Google Play排行榜(这是一个单独的活动),然后返回到我的应用程序的主要活动时,整个过程暂停(有时长达4或5秒),然后恢复正常服务 在过去的5个小时里,我到处寻找,但我就是不明白为什么会发生这种情况 在我的应用程序的活动中,我使用一个自定义的场景管理器,这样使用可以从一个“场景”导航到下一个(有点“模拟”单独的活动)。当从我的任何其他场景返回到我的主菜单时,一切都是即时的。我只有在从外部活动(我的play services排行榜)返回时才会遇到此问题 以下是我的排行榜代码: 如果有人能提供任何建议,我将不胜感激Android 从排行榜返回时,主活动暂停几秒钟(由于重新加载纹理),android,android-activity,google-play-services,google-play-games,leaderboard,Android,Android Activity,Google Play Services,Google Play Games,Leaderboard,我的应用程序只有一个活动 当我启动我的Google Play排行榜(这是一个单独的活动),然后返回到我的应用程序的主要活动时,整个过程暂停(有时长达4或5秒),然后恢复正常服务 在过去的5个小时里,我到处寻找,但我就是不明白为什么会发生这种情况 在我的应用程序的活动中,我使用一个自定义的场景管理器,这样使用可以从一个“场景”导航到下一个(有点“模拟”单独的活动)。当从我的任何其他场景返回到我的主菜单时,一切都是即时的。我只有在从外部活动(我的play services排行榜)返回时才会遇到此问题
if (scoresButtonPresses){
displayLeaderBoard();
}
void displayLeaderBoard(){
//Display the leaderboard if already signed in
if (checkSignedIn()){
startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), leaderboardID), 1);
}
//if not already connected, then set flag and connect to play services before displaying leaderbaord
else{
signInAction=SHOW_LEADERBOARD;
getGameHelper().beginUserInitiatedSignIn();
}
}
@Override
public void onSignInSucceeded() {
//If the flag is set, then display the leaderboard
if (signInAction==DISPLAY_LEADERBOARD){
startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), leaderboardID), 1);
}
//Otherwise, reset the flag and take no action
else {signInAction=NO_ACTION;}
}
编辑
我想我已经解决了问题所在,但我需要知道如何阻止它发生
因此,在我的onSurfaceCreated()方法中,我加载了所有位图并将纹理设置为:
atlas= BitmapFactory.decodeResource(view.getResources(), R.drawable.mainatlas, BMFOptions);
然后,我将其设置为纹理,如下所示(setTexture是我的自定义Quad类中的一个方法:
sprite1.setTexture(view, atlas);
然后我回收图像,因为它不再需要
atlas1.recycle();
因此,当我从排行榜活动返回到主要游戏活动时,它调用onSurfaceCreated()同样,暂停是因为它正在重新加载所有图形/纹理。不幸的是,这是一个要求,因为这是一个openGL应用程序,建议在这里加载纹理,以防GL上下文丢失
我不确定的是,我的GL上下文真的丢失了吗?只需启动一个排行榜活动并立即返回到它的父活动?如果没有,我是否有办法检查它是否丢失,如果没有,然后跳过所有加载
我在某个地方读到,如果调用onSurfaceCreated,则意味着或者方向已更改(由于我的应用程序被锁定到横向),或者GLContext已丢失。这是否正确?如果是,在重新加载所有纹理时,我如何处理此暂停?!启用GameHelper的调试日志:
getGameHelper().enableDebugLog(true);
这将为您提供更多关于谷歌服务正在做什么的信息,然后检查LogCat的时间间隔,它应该指示挂起的位置
从排行榜返回时调用的唯一方法应该是onResume()和onActivityResult()。将这些方法以及调试日志发布在此处可能会有所帮助
Zippy:Hi@BrianDeWolff,谢谢。我想我已经发现了问题所在,因为我怀疑这是一个排行榜活动与问题无关,请查看我问题中的编辑。这是因为纹理(重新)加载到我的onSurfaceChanged()中方法。如果您有任何建议,将不胜感激。谢谢!:-)
BrianDeWolff:这很有道理。我没有与德国劳埃德船级社合作的经验,但这似乎是一个非常常见的投诉/问题。例如:检查活动的
onResume()
和onActivityResult()
中的代码;当从排行榜返回到您的活动时,他们都会被呼叫。如果您使用的是BaseGameActivity
,那么它也会调用mHelper.onActivityResult()
,这可能会导致轻微延迟。您好@BrianDeWolff,谢谢。我想我已经发现了问题所在,因为我怀疑这是一个排行榜活动与问题无关,请参阅我问题中的编辑。这是因为在我的onSurfaceChanged()方法中(重新)加载了纹理。如果您有任何建议,我将不胜感激。谢谢!:-)这是有道理的。我没有与德国劳埃德船级社合作的经验,但这似乎是一个非常常见的投诉/问题。例如: