纹理缓存

1.纹理缓存

1.1纹理

一般游戏引擎要显示一张图片,首先要把本地资源文件要读取到内存,然后针对文件格式进行解码,转换为GPU可以识别的格式。这块可被GPU的内存中的图像数据,被称为纹理。
从文件转化为纹理的过程,有两个因素影响效率:

  • 从存储器读取到内存的速度。读取数据的I/O响应时间,将严重影响游戏速度
  • 图片解码速度。图片越大,需要消耗的cpu时间越长

1.2 纹理图集

为了节省内存空间,并减少大量琐碎的小文件的读取引发的多次I/O操作,将多个纹理拼成一个大的纹理图。称为纹理图集。
从另一个角度看,在OpenGL Es处理图像也是类似,使用纹理图集或精灵表单一次性把所有图像一次性交给OpenGL ES比单个图像逐个交给OpenGL ES处理要高效。

1.3 缓存

把已经加载的纹理缓存起来,以后在使用相同的图片做纹理的时候,直接从缓存中存取,无需再进行一次读取解压操作。纹理缓存是典型的空间换取时间方案。

缓存管理

每一次加载图片资源,会先从纹理缓冲中寻找,如果找到直接返回,如果没有则把图片加载到缓存中再返回。但这样做的缺点是,如果加载的资源一直是最新的。纹理资源不会从内存中销毁。内存会一直增长。

  1. 自动缓存纹理
    cocos中,直接用display.newSprite(fileName)创建的精灵,引擎内部会自动把纹理加载到缓存中。
  2. 手动缓存纹理addImage(同步) addImageAsyns(异步)
local textureCache = cc.Director:getInstance():getTexTureCache()
local texture = textureCache:addImage(filename)
  1. 获取纹理
local texture = textureCache:getTextureForKey(fileName)
    sprite:setTexture(texture)   --给精灵换皮肤
  1. 清除缓存
    cocos2d-x对缓存的管理也是引用计数的管理方式,调用固定接口时候,会释放引用计数为1的纹理
removeUnUsedTexture()
removeAllTexture()

2.精灵帧缓存

2.1精灵帧

精灵帧是在纹理的基础上的进一步封装,他在纹理上定了一个矩形区域,已确定纹理的可是范围。这样同一张纹理就可以变化为多个帧。精灵表单的实现就是用纹理的矩形区域来定义的。

2.2精灵帧缓存

和上述纹理缓存功能类似。不同的是如果在内存池中不存在要查找的图片,他会提示找不到,而不会去本地加载图片。

你可能感兴趣的:(纹理缓存)