applicationDidEnterBackground + Director-> stopAnimation()=黑屏

时间:2015-02-11 07:27:22

标签: android cocos2d-x

在我的AppDelegate的applicationDidEnterBackground()中,我调用cocos2d :: Director :: getInstance() - > stopAnimation(),并在applicationWillEnterForeground()中调用cocos2d :: Director :: getInstance() - > startAnimation ()。

但是可以调用applicationDidEnterBackground,游戏仍然可以在屏幕上看到,而且不仅当游戏被主页按钮最小化(并且变得不可见)时,例如当你在游戏中开始购买过程时,以及谷歌账单显示它的弹出窗口。如果您现在在此弹出窗口处于活动状态时旋转屏幕,则游戏屏幕全黑,结果为黑屏,只显示Google帐单对话框。 如果谷歌计费对话框可见,您最小化应用程序然后将其恢复。

我能解决这个问题的唯一方法就是不要调用stopAnimation。

这会对电池寿命产生负面影响,还是cocos2d-x会在最小化时自动暂停所有操作?

我能够看到如何正确修复这个问题的唯一方法是通过了解游戏在后台放置时是否仍然可见,我可以通过覆盖onStop()函数来做到这一点在Android上。

那么别人怎么解决这个问题呢? 您是否选择停止动画并将黑屏视为次要副作用,还是让动画保持运行?

暂停/恢复导演具有相同的效果btw ...

非常感谢任何帮助!

亲切的问候, 密歇根州

1 个答案:

答案 0 :(得分:2)

如果您的游戏/应用进入后台模式,其Activity将停止更新,因此无论您是否呼叫stopAnimation(),所有OpenGL绘制呼叫都将保留。因此,如果您的游戏没有任何后台工作要做,它不会影响电池续航时间。

此外,当您拨打stopAnimation()时,为什么屏幕会变黑?我们来看一些代码:

void CCDisplayLinkDirector::mainLoop(void)
{
    if (m_bPurgeDirecotorInNextLoop)
    {
        m_bPurgeDirecotorInNextLoop = false;
        purgeDirector();
    }
    else if (! m_bInvalid)
    {
         drawScene();

         // release the objects
         CCPoolManager::sharedPoolManager()->pop();        
    }
}

void CCDisplayLinkDirector::stopAnimation(void)
{
    m_bInvalid = true;
}

如果调用stopAnimation(),它也将停止OpenGL绘图调用。游戏的最后一帧仍会显示,但如果你的游戏进入后台或其他Activity或者前面有弹出的东西,因为没有新的抽奖调用更新游戏的Activity,它将变成全黑