描述:
想实现一个开场动画,是一个370帧17秒的帧动画,同时播放音乐形成开场动画效果,但是在电脑商运行没问题,打包到安卓机上却会卡的十分厉害,想请教有没有什么实现的方法,比如做成视频之类的来进行播放什么的,如果能直接代码解决最好,因为图片是480*800的,比较大,用texturepacker好像会打包的很乱,很多文件,图片经过tinypng压缩了,音乐进行了预加载[
代码如下:
复制代码
void StartScene::menuStartCallBack(Ref* pSender){
//replace scene
auto callbackFunc = [&](){
auto scene = GameScene::createScene();
Director::getInstance()->replaceScene(scene);//TransitionCrossFade TransitionMoveInT::create(2.0f, scene)
};
CallFunc* callFunc = CallFunc::create(callbackFunc);
//antimation
Sprite* runSp = Sprite::create("part/link_start (1).png");
runSp->setRotation(-90.0f);
runSp->setPosition(Point(GAME_SCREEN_WIDTH / 2, GAME_SCREEN_HEIGHT / 2));
this->addChild(runSp);
auto actions = Sequence::create(createStrAnimate(), callFunc, NULL);
runSp->runAction(actions);
}
Animate* StartScene::createStrAnimate(){
int iFrameNum = 375;
SpriteFrame* frame = NULL;
Vector<SpriteFrame*> frameVec;
for (int i = 1; i <= iFrameNum; i++){
frame = SpriteFrame::create(StringUtils::format("part/link_start (%d).png", i), Rect(0, 0, GAME_SCREEN_HEIGHT, GAME_SCREEN_WIDTH));
frameVec.pushBack(frame);
}
Animation* animation = Animation::createWithSpriteFrames(frameVec);
animation->setDelayPerUnit(0.045f);
Animate* action = Animate::create(animation);
//music
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("linkstr.ogg", false);
return action;
}

解决方案1:
我知道卡的原因。我先给你解决这个问题,然后告诉你以后怎么找出真机卡的原因。
卡的原因在于 auto actions = Sequence::create(createStrAnimate(), callFunc, NULL);
因为你这个createStrAnimate()是实时创建的。这个帧动画创建会非常慢。为什么会慢?因为图片加载在真机上需要很长时间。
所以 你应该在init函数 把这个
Animation* animation 加载好。甚至,你可以做个loading界面专门来干这件事。
然后animation ->retain();存起来。不要每次都创建。
然后这个问题就解决了。
===============================
接下来告诉你怎么找出真机卡的原因以及是什么代码导致的卡。
就上面这个例子来说,你可以在每个函数 开头和结束 都用计时函数去计时并输出执行时间,你就可以找到在电脑和安卓板上的区别。你会发现createStrAnimate()占用了非常多的时间,而其中里面的 for (int i = 1; i <= iFrameNum; i++){ 又占用了非常多时间。
再然后,你会发现,其实是加载图片的问题。
所以你就知道怎么解决了