Egret引擎游戏内存优化指南

本文介绍了一款基于Egret引擎的中度服饰游戏在内存优化方面的实践。通过排查内存泄露、使用对象池和优化图片加载等方式进行优化,特别介绍了如何通过手动释放图片资源来避免内存泄漏。

Egret引擎游戏内存优化指南

最近我们在开发一款中度服饰游戏,里面用到了大量的服饰图片。游戏测试过程中发现内存一直在不断增长,在部分低端机型下出现闪退现象,下面来说说解决过程。

毫无疑问,这是一个对内存进行有效管理的问题。明确了方向,那我们就从下几步进行排查:
1、排查是否存在内存泄露,看js对象的创建后是否有删除引用,是否有移除侦听;
2、使用对象池,减少重复对象的频繁创建
3、优化图片素材尺寸,减少不必要图片的加载
这样改完之后,测试发现效果并不明显,内存依旧会不断增加。

  • 难道是图片内存没有释放?
    看着这么大的内存,基本可以明确是图片的原因

  • 那图片内存要怎样才能释放?
    检查代码已经没有地方对图片进行引用了,按理说应该会被垃圾回收器回收啊!

  • 怎么办?
    查引擎文档,发现有个RES.destroyRes的API,作用是:销毁单个资源文件或一组资源的缓存数据。
    再阅读源码,发现Egret引擎会对资源进行引用,如果不调用RES.destroyRes进行资源释放,图片内存不会进行回收!
    结论:通过引擎加载的所有图片,如果不手动销毁对象,那么图片会一直缓存在内存里面。加载的图片越多,内存占用越大,直到闪退。Egret引擎本身没有任何内存管理策略。

  • 再接下来怎么办?
    知道了原因,就好办了,针对每个功能模块,在合适的位置,释放图片资源。
    游戏素材一般包括以下这些:
    1、 UI图片,比如弹窗、界面、按钮,一般打包进代码包
    2、 远程加载的图片,比如大背景,根据用户数据特定加载显示的图片
    3、 Mp3声音文件

我们制定了以下资源内存管理的策略:

  1. 针对大的UI素材 png、jpg等,针对每个功能模块,在界面关闭的时候 调用 destroyImage释放图片资源。
  2. 针对 远程http的的图片,
    A、非列表item使用的图片用 reSetImage方法代替设置img.source, 同时关闭界面时 调用destroyImage释放图片资源。
    B、滚动列表里面用到的图片 用HttpImageCacheManage 管理,在关闭界面时释放图片资源。
  3. mp3声音文件,针对每个功能模块,在关闭界面时释放

下面为几个核心方法的代码:

/**
  * 释放资源,一般是释放 eui.image的资源
  * 使用场景: 在界面关闭的时候调用;
  * 使用示例:destroyImage(this.bg);
  * 使用建议:尺寸大于1024的图片对象调用本方法释放掉
  * 参数:支持 资源名,url,或image对象
  */ 
 public destroyImage(name:string | eui.Image){
   
   
     if(name instanceof eui.Image){
   
   
         if(name.source){
   
   
             let source = name.source;
             if(DEBUG) console.warn("释放:" + source)
             name.source = "";
             if(RES.getRes(<any>source))
                 return RES.destroyRes(<any>source);
         }
         return false;
     }
     if(DEBUG) console.warn(</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星之Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值