之前看到一篇文章,就是说使用 [CCSprite spriteWithFile:@"test.png"] 这种方式来管理内存的用度是不可取的!

思忖了一下确实觉得有道理,你让程序去自动管理内存,程序是做不到像人这样对程序的理解的,

无可厚非,程序无法在资源不再会被用到的时候马上将之请出内存,

java 是的内存回收机制是这样, objective-c 的 autorelease 也是这样,

要想得到高效运行的程序,你就得付出额外的努力去做一些处理!

spriteWithFile 得到的就是一个 autorealse 的 sprite,

在这个过程中会将一张图片绑定为 opengl 的纹理,

cocos2d里面,opengl 的每一张纹理都由一个 CCTexture2D 对象来管理。

如上,采用 spriteWithFile 加载进来的图片,也是由程序自动管理何时释放的。

那么,到底是何时释放呢?这个答案在网上看到过无数次:在机器的内存不够用的时候才会释放!

我的看法和上面说的写那篇文章的人有点儿出入,即是不一定非得去用 CCSprite alloc] initWithTexture:....这样。

具体请参照我之前转载的那篇文章。

不过,对于 CCTexture2D 的管理,确实得亲力亲为,不需要的时候就给移除了吧。

其实说是这么说,考虑到游戏会重来什么的,有的图片你刚卸载掉,说不定马上又得加载到内存里面

这不是一件容易的事情,你得权衡到底要不要释放,不一定在不需要的时候释放掉了就一定好。

缓存是能够带来性能上的提升的,不过却要耗费额外的内存。

数据库缓存,浏览器缓存,服务器缓存,cpu也有缓存,可以想见,缓存其实也是一个很重要的概念,你不能去无视他。

好吧,讨论一些理论上的东西会显得有些枯燥,让我们来看一些具体的做法:

NPOT 的问题一定要到过吧,稍微有点儿使用 cocos2d 经验的。

NPOT 这个 bug 出现的原因就是因为所使用的 pvr 的尺寸不符合2的n次幂!

但是在一定情况下,不符合 2 的 n 次幂的尺寸的图片美工都给你出好了,你怎么办?

让美工返工,全部改成 2 的 n 次幂?估计你要找打~

这时候推荐一个工具 , texturePacker,通过这个工具你能将不符合尺寸要求的图片放置到另一张复合尺寸要求的图片中。

不过这里将衍生出一个新的问题,生成的东西变成了 2个:

一个是pvr 文件,一个是指明有效图片在容器图片中位置,高宽等数据的 plist 文件。

若要亲力亲为去高效管理 texture,那么就要将目光由 CCSprite 转向 CCTexture2D,

而如上所生成的两个文件,现在已经不能用  CCTextureCache 的 addImage 方法来加载成 CCTexture2D 对象了,

原因很简单,有效纹理只是占据了整张纹理的一部分,用起来十分不方便~

这个时候要用 CCSpriteFrameCache 来进行管理, 用 CCSpriteFrameCache 的 addSpriteFramesWithFile 方法。

使用的使用很简单,CCSprite spriteWithSpriteFrameName 即可。

因为这里并不涉及的打包纹理集,所以说,一份pvr、plist 仅仅对应一张的纹理图片。

完美控制内存释放没有问题,但就是有点儿麻烦:

1。CCSpriteFrameCache 调用 removeSpriteFramesFromFile 将相关的 spriteFrame 对象销毁掉,

这不执行完毕之后,相关 texture 的引用计数会 -1,但-1之后还未达到 0,因此不会被销毁,依然占据内存。

2。CCTextureCache 调用 removeTextureForKey ,这里又会将 相关 texture 的引用计数 -1,

这里依然不能达到0, 因此 texture 又不会被销毁。

3。这步不用你管了,texture 而今只被 sprite 引用着了,等到这个sprite 被自动销毁的时候,texture 就会马上被请出内存。

我用了一点儿小策略,用一个数组成员变量将纹理图片的名字(不带文件后缀)保存了起来,

在dealloc 的时候取出数组中存储的名称作为键,按照前述的步骤对纹理做即时释放~

阐述的不是很清晰,下次得空整理下思路把示例代码贴上来再写一篇~

转载于:https://www.cnblogs.com/yang3wei/archive/2012/06/13/2739704.html

cocos2d 加载自由尺寸 pvr 的可行方案相关推荐

  1. three.js加载和使用纹理-加载DDS、PVR、TGA格式的纹理(vue中使用three.js73)

    加载DDS.PVR.TGA格式的纹理 1.demo效果 2. 实现要点 2.1 加载DDS格式纹理 2.2 加载PVR格式纹理 2.3 加载TGA格式纹理 3. demo代码 1.demo效果 以上三 ...

  2. html如何使多张图片滑动不卡顿,Web端大量图片同时加载卡顿问题的优化方案

    案例 由于业务的需要,需求方需要实现一个大量图片同时加载的需求.在实现这个需求的过程中,可能会遇到很多的坑,这里小编也总结了一些优化方案,我们可以一起来看看. 具体场景 在描述如何解决问题,我们现在先 ...

  3. html页面加载动画尺寸,6种CSS3加载动画

    插件描述:6种CSS3炫酷预加载Loading,非常酷的纯CSS3炫酷预加载Loading指示器动画特效.这组loading指示器共6种效果,都是使用:before和:after伪元素,以及CSS帧动 ...

  4. Glide加载图片尺寸不对的问题

    问题: 因为icon_missing_image这张占位图尺寸导致问题: 如果Imageview中默认的占位图片大小没有填满Imageview,比如Imageview100*80,但是给Imagevi ...

  5. ios 图片加载内存尺寸_iOS内存分析上-图片加载内存分析

    简介 对于大多数App来说,内存占用主要就是图片.本文将从实用的角度分析,iOS图片的内存占用.测量.优化等. iOS内存-有什么影响 在移动操作系统设备中,是不能像PC一样进行内存swap的,而随着 ...

  6. 根据设备不同,加载不同尺寸图片

    针对自适应网站,图片是最难把控的,特别是banner类型的大图片. js: $(function(){//根据不同浏览设备,加载不同图片pic_html();function pic_html(){i ...

  7. ios 图片加载内存尺寸_iOS加载超清大图内存暴涨问题解决

    加载超清大图是会引起内存爆表的问题,最近一直困扰着我. SDWebImage在加载大图时做的不是很好,加载大图内存爆表.YYWebImage会好一点,但还是不行. 当不要求图片质量的情况下,最好是在上 ...

  8. Picturefill.WP – 根据屏幕尺寸加载合适的图片

    Picturefill.WP插件利用picturefill.js脚本展示Responsive图片,即根据视口宽度选择尺寸合适的图片加载,节省带宽,提高网站载入速度.例如用户用手机访问站点,该插件会选择 ...

  9. h5 先加载小图_干货!高手珍藏版的H5秘密尺寸

    近期关于图片的热门问题: "易企秀H5的尺寸是多少? 易企秀的图片大小是多大? 易企秀的背景像素是多少? --" 为了大家更加方便快捷的制作H5,现在先将这些图片尺寸和大小通通告知 ...

  10. android drawable 图片大小,不同的drawable文件夹下图片加载到内存后图片尺寸大小的分析...

    先说结论: 不同drawable文件下图片在同一手机图片尺寸是不同的 同一个drawable文件夹下的图片在不同分辨率的手机图片尺寸是不同的 先聊下DP 要在密度不同的屏幕上保留界面的可见尺寸,您必须 ...

最新文章

  1. 安卓怎么用抖音做锁屏_把锁屏密码设置成当前时间,随时间的变动!别人怎么也猜不出来...
  2. java script 教程_Java Script入门
  3. 《大话数据结构》第9章 排序 9.3 冒泡排序(上)
  4. RHEL修改最大文件打开数,关于epoll socket Too many open files问题的解决
  5. mybatis-批量操作
  6. android九宫格密码源码,Android九宫格解锁的实现
  7. 国产自主研发编程语言火了,同行十二年,不知Python是木兰?
  8. Linux|麒麟操作系统实现多路RTMP|RTSP播放
  9. apache2.2:使一个目录允许执行cgi程序
  10. 某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法
  11. [C++] - Returning by const value
  12. 关于git clone 下载apex 过程中,缺少libssl.so.1.0.0的问题
  13. jQuery:获取浏览器中的分辨率
  14. Manjaro Gnome 安装TIM
  15. [小o地图-数据] - 获取全国行政区划轮廓数据(上)
  16. 技术大佬都在看的几个公众号
  17. 越努力,越幸运—2021年终总结
  18. 数据分析之数理统计基础
  19. java会员卡管理系统下载_基于jsp的会员卡管理系统-JavaEE实现会员卡管理系统 - java项目源码...
  20. 办理《北京市工作居住证》各项变更须提交材料

热门文章

  1. java出现次数最多的字母_java计算给定字符串中出现次数最多的字母和该字母出现次数的方法...
  2. vue-cli 4.5.4 配置node-module里的图片不转base64
  3. 为什么 5、6 月会空缺出大量技术岗?跳槽注意事项 + 面试官关心什么?
  4. 文件传输助手(swing单机版)
  5. python scipy integrate_python – 使用scipy.integrate.quad来整合复数
  6. 我的 2015 年度小结(技术方面)
  7. Linux各发行版介绍
  8. mysql 家谱关系_[MySQL]请教族谱表中求祖先及后代的SQL
  9. GGE学习(一)统计所有区域的影像均值并输出为shp
  10. Python简单实例之———用户简单信息调查问卷