从排行榜返回时主要活动暂停几秒钟(由于重新加载纹理)

时间:2014-06-13 19:07:32

标签: android android-activity google-play-services google-play-games leaderboard

我的应用只有一项活动。

当我启动Google-Play排行榜(这是一项单独的活动)然后返回我应用的主要活动时,整个过程暂停(有时持续4或5秒),然后才能恢复正常服务恢复。

过去5个小时我一直在搜索高低,但我无法理解为什么会发生这种情况。

在我的应用程序活动中,我使用自定义场景管理器,因此使用可以从一个场景中导航'当我从其他任何场景返回主菜单时,一切都是瞬间完成的(有些模拟'单独的活动)。从外部活动(我的游戏服务排行榜)返回时,我只会遇到此问题。

这是我的排行榜代码:

非常感谢任何人都可以提供的任何指示。

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已经丢失。它是否正确?如果是这样,我怎样才能在重新加载所有纹理时处理这个暂停?!

1 个答案:

答案 0 :(得分:0)

启用GameHelper的调试日志:

getGameHelper().enableDebugLog(true);

这将为您提供有关Google服务正在执行的操作的更多信息,然后查看LogCat的时间间隔,该时间间隔应指示其挂起的位置。

从排行榜回来时调用的唯一方法应该是onResume()和onActivityResult()。将这些方法发布在此处以及调试LogCat可能会有所帮助。

Zippy:嗨@BrianDeWolff,谢谢。我想我已经发现了问题所在,因为我怀疑它是排行榜活动与问题无关,请在我的问题中查看我的编辑。这是因为在我的onSurfaceChanged()方法中(重新)加载了纹理。如果您有任何建议,将不胜感激。谢谢! : - )

BrianDeWolff:这是有道理的。我没有与GL合作的经验,但这似乎是一个非常普遍的抱怨/问题。例如:https://gamedev.stackexchange.com/questions/12629/workaround-to-losing-the-opengl-context-when-android-pauses