applicationDidEnterBackground + Director->stopAnimation() = 黑屏
applicationDidEnterBackground + Director->stopAnimation() = black screen
在我的 AppDelegate 的 applicationDidEnterBackground() 中,我调用 cocos2d::Director::getInstance()->stopAnimation(),在 applicationWillEnterForeground() 中,我调用 cocos2d::Director::getInstance()->startAnimation()。
但是 applicationDidEnterBackground 可以在游戏仍然在屏幕上可见的情况下被调用,不仅是当游戏通过主页按钮最小化(并且变得不可见)时,例如当您在游戏中开始购买过程时,并且 google billing 显示它的弹出窗口。如果您现在在弹出窗口处于活动状态的情况下旋转屏幕,游戏屏幕将全黑,结果是黑屏,只有 google 计费对话框可见。
如果 google 计费对话框可见,并且您最小化应用程序然后再将其恢复,也会发生同样的情况。
我能解决这个问题的唯一方法是不调用 stopAnimation。
这是否会对电池寿命产生负面影响,或者 cocos2d-x 会在最小化时自动暂停所有操作?
我能看到如何正确解决这个问题的唯一方法是了解游戏在置于后台时是否仍然可见,我可以通过重写 Android.
那么其他人是如何解决这个问题的呢?
您是选择停止动画并将黑屏视为次要副作用,还是离开动画 运行?
Pause/Resuming Director 有同样的效果 btw...
如有任何帮助,我们将不胜感激!
亲切的问候,
密歇根
如果您的 game/app 进入后台模式,其 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
,它会变成全黑.
在我的 AppDelegate 的 applicationDidEnterBackground() 中,我调用 cocos2d::Director::getInstance()->stopAnimation(),在 applicationWillEnterForeground() 中,我调用 cocos2d::Director::getInstance()->startAnimation()。
但是 applicationDidEnterBackground 可以在游戏仍然在屏幕上可见的情况下被调用,不仅是当游戏通过主页按钮最小化(并且变得不可见)时,例如当您在游戏中开始购买过程时,并且 google billing 显示它的弹出窗口。如果您现在在弹出窗口处于活动状态的情况下旋转屏幕,游戏屏幕将全黑,结果是黑屏,只有 google 计费对话框可见。 如果 google 计费对话框可见,并且您最小化应用程序然后再将其恢复,也会发生同样的情况。
我能解决这个问题的唯一方法是不调用 stopAnimation。
这是否会对电池寿命产生负面影响,或者 cocos2d-x 会在最小化时自动暂停所有操作?
我能看到如何正确解决这个问题的唯一方法是了解游戏在置于后台时是否仍然可见,我可以通过重写 Android.
那么其他人是如何解决这个问题的呢? 您是选择停止动画并将黑屏视为次要副作用,还是离开动画 运行?
Pause/Resuming Director 有同样的效果 btw...
如有任何帮助,我们将不胜感激!
亲切的问候, 密歇根
如果您的 game/app 进入后台模式,其 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
,它会变成全黑.