注册 登录
主题 : cocos2d 序列帧动画的原理是怎样的?
级别: 新手上路
UID: 330889
精华: 0
发帖: 7
可可豆: 34 CB
威望: 34 点
在线时间: 9(时)
注册时间: 2014-06-22
最后登录: 2015-08-21
0 楼:  发表于: 2014-08-26 15:46    发自: Web Page
来源于 技术疑问 分类

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

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

级别: 新手上路
UID: 30936
精华: 0
发帖: 44
可可豆: 100 CB
威望: 80 点
在线时间: 132(时)
注册时间: 2010-09-16
最后登录: 2016-07-14
1 楼:  发表于: 2014-08-26 16:04    发自: Web Page
题主最好能把序列帧动画的代码发出来看一下,看看两种方式实现有何不同。

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



按这个描述,你可能是在schedule的回调函数被调用时,才开始读取某一帧图片,与
引用
我在使用序列帧动画时发现,只要定义好序列帧动画播放的时长,
相比,这种方式多了把图片加载到内存(
TextureCache)中的开销,导致时间延迟。


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



级别: 新手上路
UID: 330889
精华: 0
发帖: 7
可可豆: 34 CB
威望: 34 点
在线时间: 9(时)
注册时间: 2014-06-22
最后登录: 2015-08-21
2 楼:  发表于: 2014-08-26 16:35    发自: Web Page
序列帧动画的代码就不贴了,就是从文档里拷贝下做的修改。下面是schedule的回调函数



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


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


级别: 新手上路
UID: 30936
精华: 0
发帖: 44
可可豆: 100 CB
威望: 80 点
在线时间: 132(时)
注册时间: 2010-09-16
最后登录: 2016-07-14
3 楼:  发表于: 2014-08-26 17:27    发自: Web Page
序列帧动画的确是把所需要的纹理都加载到内存,然后开始播放的,这是用空间换时间的的方案。

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

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部