cocos2d 序列帧动画的原理是怎样的?

我在使用序列帧动画时发现,只要定义好序列帧动画播放的时长,动画总能在定义好的时间内播放完毕。但是当我想想用schedule来模拟序列帧动画时,却不一定了。
比如我有150帧,想要10秒播放完毕,于是我设置每隔(1/15)秒的时间运行下schedule的回调函数来读取并显示其中的一帧画面。但是这样做往往不能保证10秒内播放完,会超出一两秒。
所以我想问,schedule难道是这次运行完才能运行下次的吗?而不是严格按照设置的时间间隔来运行?
如果我想实现实时的序列帧播放的效果,用schedule的话应该怎样实现呢?

题主最好能把序列帧动画的代码发出来看一下,看看两种方式实现有何不同。

— Begin quote from ____

我设置每隔(1/15)秒的时间运行下schedule的回调函数来读取并显示其中的一帧画面。但是这样做往往不能保证10秒内播放完,会超出一两秒。

— End quote

按这个描述,你可能是在schedule的回调函数被调用时,才开始读取某一帧图片,与
— Begin quote from ____

我在使用序列帧动画时发现,只要定义好序列帧动画播放的时长,

— End quote

相比,这种方式多了把图片加载到内存(TextureCache)中的开销,导致时间延迟。

想验证schedule是否严格按时间间隔运行,可以在schedule回调函数内加上cclog("%f", t)来验证

序列帧动画的代码就不贴了,就是从文档里拷贝下做的修改。下面是schedule的回调函数

void MovieLayer::updateFrame(float delta){
Director::getInstance()->getTextureCache()->removeAllTextures();
if (currentFrame <= 148) {
char tempPath = {"\0"};
sprintf(tempPath, “%s/img%d.jpg”,folderPath,currentFrame);
frame->setTexture(tempPath);
log("%f\n",delta); currentFrame ++;
}
}

这里主要是觉得序列帧动画占用的内存太大了,所以用schedule,并在每帧清理下前一帧的缓存(Director::getInstance()->getTextureCache()->removeAllTextures();)
我觉得你说得对,应该是载入纹理花了时间。而序列帧动画好像是在播放前把所有纹理都加载进内存的,而且播放完了还是没有释放。

序列帧动画的确是把所需要的纹理都加载到内存,然后开始播放的,这是用空间换时间的的方案。

如果你觉得占用内存过大,那么使用schedule也是可以使实现相似的效果,但是你需要自己实现一套纹理管理机制,在调用所需要的纹理前加载它到内存,同时释放不需要的纹理。