首先,我要说的是,以下所有内容都是基于cocos2d-x-2.1.4。
在cocos2d-x的HelloCpp项目中,您可以看到它在CCDirector::sharedDirector()->stopAnimation();
(click here to check)中调用了void AppDelegate::applicationDidEnterBackground()
。
它假定在应用程序不 Activity 时停止动画。而且它在iOs中表现完美。
但是在Android中,当我调用此stopAnimation()
后,正在运行动画的元素将开始闪烁。由于设备性能较低,因此显示效果更差。
然后,我尝试使用CCDirector::sharedDirector()->pause()
,它的表现还不错,动画停止了,并且 NOT 闪烁了。
所以我想知道这两种方法之间的区别。
在 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]。”,但实际上,如果我调用
pause()
,我可以暂停动画,所以我很困惑。在此post中,它表示如果在
CCDirector::sharedDirector()->pause();
中调用void AppDelegate::applicationDidEnterBackground()
,则应用程序将崩溃。但我自己进行了测试,在iO和Android中,该版本均未崩溃。所以,我想如果我使用
pause()
而不是stopAnimation()
会发生什么。然后我做了一些测试。最终我得到了结果,在iO中
stopAnimation()
的性能优于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
}
现在有人可以给我一些建议吗?或者,如果不好,请告诉我原因。
最佳答案
暂停将继续绘制并呈现帧缓冲区,但是帧速率非常低(4 fps)。
StopAnimation完全停止绘制。此时,还没有定义显示器会发生什么-在iOS上,它往往只是“冻结”,但是根据GL驱动程序的实现,您可能会眨眼。这是双重或三重缓冲保持循环通过帧缓冲区的时间,但是其中只有一个包含cocos2d最后绘制的帧的内容。
停止动画仅适用于应用程序进入背景或以其他方式隐藏的情况,例如,在应用程序上方显示另一个视图。否则请使用暂停。
也许您只需要在应用程序进入前台时再次运行startAnimation即可防止闪烁?当然,不需要在一个平台上使用暂停,而在另一个平台上使用stopAnimation。