1.之前
1.Sprite 与 SpriteFrame 图片的缓存
sprite->getSpriteFrame() 得到 SpriteFrame
Sprite::createWithSpriteFrame(spriteframe) 创建 sprite
2.Sprite 与 RenderTexture 把纹理渲染到手机上
RenderTexture* render =RenderTexture::create(sprite->getContentSize().width, sprite->getContentSize().height,
Texture2D::PixelFormat::RGBA8888)
render->begin()
sprite->visit() 渲染sprite及他的孩子
render->end()
3.RenderTexture 与 Image
render->newImage() 得到Image:图片属性信息
4.Texture2D 纹理
图片的纹理,一个从纹理缓存里得到图片纹理 TextureCache 方法 addImage(“xxx.png”)
纹理其实就是一块内存!这块内存中存放的是按照指定的像素格式填充的图片像素信息。
5.TextureCache
(1)添加图片到缓存
(2)图片以纹理(Texture2D)的形式存在缓存里
(3)通过RenderTexture 渲染此图片纹理
第一次使用image.png这图片有两个步骤,一个是先将图片加载进TextureCache缓存中,下一步是绘制图片,从而将其显示在场景中。
第二次使用image.png时,因为之前image.png已经被放入TextureCache中,所以这里只需从缓存中找到这张图片,然后将其绘制出来就可以。
6.SpriteFrameCache
跟TextureCache不同的是,如果内存池中不存在要查找的图片,它会提示找不到,而不会去本地加载图片。
7.AnimationCache
对于精灵动画,每次创建时都需要加载精灵帧,然后按顺序添加到数组,再用Animation读取数组创建动画。这是一个非常烦琐的计算过程。
8.使用大图的好处
(1)减少文件读取次数,读取一张图片比读取一堆小文件要快。
(2)减少OpenGL ES绘制调用并且加速渲染。
(3)减少内存消耗。OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片,如果图片大小不够则会开出多余的内存。
OpenGL ES 2.0,它不会再分配2的几次幂的内存块了
2.帧动画
1.plist实现贞播放动画原理(个人猜测)
1.把大的 png 放到内存
2.根据plist里的 rect 在内存里切大的png(重新渲染)
3.把 2 切出的小图片制作成精灵,并设置成透明
4.通过图片名,在plist里找到对应的rect,创建一个父精灵(自己创建)
5.从 4 得到的精灵,是 3 所有精灵的父亲
6.其他精灵的 action 实际上只是父精灵的 action7.定时切换,此时父精灵一直是透明的,其他精灵按照定的时间,在数组里遍历只有一个设置成不透明的。
把所有切出来的小精灵放到一个动画数组里,最终成为一个action = cc.FadeIn:create(),
数组里的动画只能是,播固定次数还是永久播放,那些移动等的 action 只靠父精灵完成
2.不用plist实现贞动画
1.大图片放到内存,可能不止一个
local textureDog = cc.Director:getInstance():getTextureCache():addImage(“dog.png”)2.切图渲染
local frame0 = cc.SpriteFrame:createWithTexture(textureDog, rect)
local frame1 = cc.SpriteFrame:createWithTexture(textureDog, rect)3.切图渲染数组动画
local tab = {frame0,frame1}
local animation = cc.Animation:createWithSpriteFrames(tab, 0.25)
local animate = cc.Animate:create(animation)