第一次加载时的动作/慢动作cocos2d
现在写,我使用cocos2d创建一个交互式电子书。当程序运行时,只有在初始加载时,封面动画才会起伏不定。这个动画在封面上,它很大。我们正在谈13个纹理地图集,26个图像。第一次加载时的动作/慢动作cocos2d
我知道这个问题源于预加载/加载图像,但是我已经在动画发生之前加载了所有图像。
-(id) init {
if((self=[super init])) {
isTouchEnabled_=YES;
//Pg0 Animations
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"CB0A0.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"CB0A1.plist"];
...etc.}}
本书整体设置如下。我构建一个场景,一个菜单层,然后菜单层推送并弹出不同的图层/不同的页面。
当封面被加载(Pg0)时,如果用户触摸图片,它将贯穿动画。然后,当用户再次触摸该图片时,将运行第二个动画。
本书的所有图像都加载在菜单图层中(所以在任何页面压入或弹出之前)。我试过在场景或单个页面上加载这些图像来加速过程,但这不会影响时间。
我正在通过动画助手运行我的动画,该动画助手为我循环显示图像。
任何帮助都会很棒,如果需要,我很乐意分享更多关于该项目的代码或信息。
检查您的AppDelegate是否实现了内存警告方法。检查该方法的作用。
默认情况下,cocos2d实现该方法并清除所有缓存。现在,当预加载纹理时触发它时,发生的情况是,cocos2d删除了预加载的纹理,因为收到了内存警告,但这些预加载的纹理尚未使用。 Cocos2d认为它们是“未使用”并将它们从内存中移除。这意味着下次使用该纹理时,需要从磁盘再次加载。
我写了一篇博客文章where I describe this issue, and ways to solve it。最重要的是:获得TexturePacker并且只使用.pvr.ccz作为纹理图集。尽可能将纹理颜色深度降低到16位。并且一定要转储纹理内存使用情况以了解您实际使用的内存量以及该内存量是否在合理范围内。包括可能支持的内存较少的旧设备。
我实际上已经在大多数优化(yay)--16位,纹理打包器,.pvr.ccz等方面遵循了您的书。但是,我不知道纹理压缩,我一定会实现,但是我读过你的博客文章描述了迄今为止的最佳实践。如果我找到其他东西,会保持更新。谢谢! –
有同样的问题。当使用cocos2d v0.9动画确定,没有滞后。迁移到cocos2d v2.0时出现延迟。当在cocos2d v0.9中添加精灵(addSpriteFramesWithFile:(NSString *)plist)时,也会创建texture2d(CCSpriteFrameCache.m:238),在cocos2d v2.0中没有创建textture2,创建了纹理首先使用CCSpriteFrame。我在CCSpriteFrameCache.m加入
[[CCTextureCache sharedTextureCache] addImage:textureFileName];
修复:207(V2.0)
我只是遇到了在cocos2d 3.1版iphone这个问题。我有缓存但仍然在加载口吃的spritesheets。我在另一篇文章中发现,你需要加载纹理本身,以摆脱最初的滞后。这是我在我的缓存精灵方法做:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"spritesheet.plist"];
CCTexture *temporaryLoadTexture = [CCTexture textureWithFile:@"spritesheet.png"];
只需通过加载虚拟CCTexture文件,即摆脱了所有的第一次动画和精灵滞后。希望这可以帮助!
我想出了我做错了什么!如果您有使用来自两个不同纹理文件的图像的动画,则假设您尚未预加载特定纹理,则会暂停加载新纹理。只需编写一行代码,如'[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@“yourTexture.plist”];'不会加载纹理缓存。您必须调用动画所在缓存的特定图像并将其添加到图层中。为此,我简单地添加了所有动画纹理的精灵,并将它们隐藏起来。 –