微信小游戏内存优化之填坑篇

最近一直被小游戏的内存搞得筋疲力尽,今天总算结束了... 现在来总结下我遇到的一些坑

首先,我们复习下creator的内存回收机制

  • 凡是静态资源(不在resources目录中的)都可以再勾选场景的自动释放资源在场景结束后自动释放
  • 凡是动态加载的资源都不会自动释放,需要手动调用cc.loader.release去释放

第一个坑,cc.loader.getDependsRecursively

官方文档在这里,里面有句话你一不小心可能会出大问题。就是获取某个已经加载好的资源的所有依赖资源,是的,如果你直接使用一个prefab去调用这个方法你可能只能得到prefab的resid。同样,如果你在prefab实例的onDestroy中调用这个方法,依然只会返回prefab的resid,因为其依赖的实例的children都已经被销毁了(我猜)。 所以正确的处理方式应该是:

onLoad(){
	this._deps = cc.loader.getDependsRecursively(this.getAsset())
}

onDestroy(){
	cc.loader.release(this._deps)
}

第二个坑,cc.loader.load

如果你用这个方法来加载远程图片资源的话,直接使用cc.loader.release释放的话是不会成功的,控制台这时会出现一个警告:

unknow asset type cc_SpriteFrame

这个警告的意思是你所要释放的贴图还被一个SpriteFrame所引用,因此你需要在释放资源之前移除这个spriteFrame的引用,代码如下

	node.getComponent(cc.Sprite).spriteFrame = null;
	cc.loader.release(remoteUrl);

第三个坑,cc.loader.release

在弄完前面两个步骤之后你可能会觉得事情还是很简单的嘛。这时候你开始测量你的内存了,首页,内存控制得不错,第二个场景,为什么内存增加了... 一直到最后,你会发现内存不停增长,完全不会下降。这是怎么回事呢?cc.loader.release会首先移除贴图的显存,内存还是它的cache里面(?不明白为什么),因此你需要在此时手动释放贴图资源占用的内存,在微信小游戏中释放一个贴图很简单:img.src= "",因此我们只要拿到贴图内部的微信image对象就好办了,代码如下:

const item = cc.loader.getRes(id);
if(item instanceof cc.Texture2D){
	item.getHtmlElementObj() && (item.getHtmlElementObj().src = '');
}
cc.loader.release(id);

开发环境:cocos creator 1.9.3

大功告成,希望大家不要再在内存上面踩坑,按时上下班?

转载于:https://my.oschina.net/ForeverZi/blog/3001431

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值