cocos2d-x CCDirector,暂停/恢复vs stopAnimation / startAnimation

时间:2013-11-01 10:53:54

标签: android ios cocos2d-x

首先,我要说,以下所有内容均基于cocos2d-x-2.1.4。

在cocos2d-x的HelloCpp项目中,您可以在CCDirector::sharedDirector()->stopAnimation();click here to check)中看到它调用void AppDelegate::applicationDidEnterBackground()

它假设在app处于非活动状态时停止动画。它在iOs中表现完美。

但在Android中,在我调用此stopAnimation()之后,运行动画的元素将开始闪烁。由于设备的性能较低,它显示得更糟。

然后我尝试使用CCDirector::sharedDirector()->pause(),表现不错,动画停止,眨眼。

所以我想知道这两种方法之间的区别。

CCDirector.h中,我们可以看到以下代码:

/** Pauses the running scene.
 The running scene will be _drawed_ but all scheduled timers will be paused
 While paused, the draw rate will be 4 FPS to reduce CPU consumption
 */
void pause(void);

/** Stops the animation. Nothing will be drawn. The main loop won't be triggered anymore.
 If you don't want to pause your animation call [pause] instead.
 */
virtual void stopAnimation(void) = 0;

在这里它说,“如果你不想暂停你的动画调用[暂停]。”但事实上,如果我打电话给pause(),我可以暂停动画,所以我很困惑。

在此post中,它表示如果在CCDirector::sharedDirector()->pause();中调用void AppDelegate::applicationDidEnterBackground(),应用会崩溃。但是我自己测试了它,它在iOs和Android这个版本都没有崩溃。

所以,我想如果我使用pause()代替stopAnimation()会发生什么。

然后我做了一些测试。最后我得到了结果,stopAnimation()在iOs中的表现优于pause(),但在Android中表现相反。

所以我想把我的代码更改为:

void AppDelegate::applicationDidEnterBackground() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CCDirector::sharedDirector()->stopAnimation();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCDirector::sharedDirector()->pause();
#endif
}

void AppDelegate::applicationWillEnterForeground() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CCDirector::sharedDirector()->startAnimation();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCDirector::sharedDirector()->resume();
#endif
}

现在有人可以给我一些建议吗?或者如果不好,请告诉我原因。

1 个答案:

答案 0 :(得分:2)

暂停将继续绘制并呈现帧缓冲,但帧速率非常低(4 fps)。

StopAnimation完全停止绘图。在这一点上,没有定义显示器会发生什么 - 在iOS上它往往只是"冻结"但是根据GL驱动程序的实现,您遇到的眨眼也可能是一种可能的结果。这是当双缓冲或三缓冲在帧缓冲区中循环时,但是其中只有一个包含cocos2d最后绘制的帧的内容。

停止动画仅适用于应用程序进入背景或以其他方式隐藏的情况,例如通过在其上方显示另一个视图。否则使用暂停。

也许您只需要在应用程序进入前景时再次运行startAnimation以防止闪烁?当然不应该要求在一个平台上使用暂停,而在另一个平台上使用stopAnimation。