关于图片纹理内存占用的问题(以Etc2压缩格式图片为例)

  • Creator 版本:2.4.0

  • 目标平台: iOS

  • 详细报错信息,包含调用堆栈:

  • 重现方式:打开demo项目build出iOS工程后,连真机运行项目。点击一下屏幕任意位置,即可加载显示一张2048x2048尺寸的Etc2 RGBA压缩格式的图片,在Xcode的Debug navigator中可以发现因为加载显示这张图片增加了8MB左右的内存占用。

感觉内存中存了双份的纹理数据,不知道有没有办法可以在内存中只留下一份数据?

启动项目后,手动在chrome控制台调用cc.sys.garbageCollect()清理原生垃圾对象后的内存

点击屏幕加载显示一张2048x2048尺寸的Etc2 RGBA压缩格式的图片,并调用cc.sys.garbageCollect()后的内存

demo.zip (2.0 MB)

进一步测试加载2张图片时,只会多出其中一张图片的双份内存占用,貌似是有一个公用的文件加载缓冲区造成的这种现象?

@huanxinyin

ios不是得pvr的么

试过pvrtc 4bpp格式,测试时感觉内存中也是存了双份的纹理数据。
而且我们有很多通用性比较强的碎图也需要压缩,用这个格式的话贴图必须是正方形且边长为2的幂次方,这样的话会降低很多内存空间使用率。

开启一下这个CLEANUP_IMAGE_CACHE试试 https://docs.cocos.com/creator/api/zh/classes/macro.html#cleanupimagecache

谢谢哥们提供的思路。
我刚在iOS真机上又测试了一遍,不管是否开启这个设置,观察内存占用是没有明显变化的。
我是通过在空场景中只加载显示一张2048x2048尺寸的图片来测试的。
看文档里主要提到微信小平台上效果会比较明显,原生平台上不知道是啥情况哎。

不能在函数里面调用这个。要写在最外面

我直接在main.js里改这个配置值,也没看到有明显的变化哎。:joy:

这个是2.2.0源码

这个是2.4.0的源码,原生平台我联机调试过,会走 initWithData 这个初始化方法,清理image对象中data数据的逻辑我这边看在c++层代码里貌似是默认做了的。不知道是不是我还是有啥地方没看到或者是理解有偏差。

释放的地方

我们项目我也有同感,感觉内存占用比想象的高

感觉这个 removeItem 对内存没啥大影响

从测试看,是GPU纹理占用一份内存,纹理资源也占用一份资源,纹理资源可以通过设置CLEANUP_IMAGE_CACHE来释放。

原来如此,谢谢大佬解答~

有结论或 解决办法,还望告知, 之前对比了好久,也不知道怎么能降下来

你是用的2.2.0版本?

CLEANUP_IMAGE_CACHE在2.4.0好像不管用,2048*2048的图,一直会存在32M左右的内存占用

大佬们升级到2.4.1吧,或者手动合并这两个pr。https://github.com/cocos-creator/engine/pull/7006,https://github.com/cocos-creator/engine/pull/6946/files。然后再设置 CLEANUP_IMAGE_CACHE

COCOS2D-X3.17想用ETC2的纹理应该怎么做啊