在原有LayaNative2.0 开源基础上做出内存释放的修改,目前达成第一期目标。
本次修改基于Laya 已经开源的 2.0 基础之上。 LayaNative 原始Git 地址:https://github.com/layabox/LayaNative2.0
没有接触过Laya源码,也没有写过Laya的JavaScript 业务逻辑,总共的分析和修改在两个星期内。
现状:Laya 的原始设计不支持卸载,即初始化过后Laya 引擎,整个引擎的生命周期就开始运行,直到APP 运行结束。
问题:
- 在混合型APP 中,使用不到Laya 的部分,Laya持有的内存依然存在,强制释放LayaRuntime ,再次载入会出现Crash。
- Laya 在内存占用部分比较大。
分析查找过程:https://www.notion.so/Laya-01efca05091d4f9ca3aded902fc759b4
本次修改主要集中在iOS 侧。
在测试中,使用Laya 暴露的外围接口做释放操作,现象是使用的内存并没有如预期下降。
猜侧一:因为运行环境是iOS,所以猜侧Object-C语言对于对象的强制引用可能导致iOS 的组件儿没有在合理的时间得到释放。经过验证,猜侧成立。
猜侧二:LayaNative 归属于游戏引擎,所以在内部使用中一定会用到大量的单利对象,因为静态单利对象的生命周期一般在于构造开始到APP 运行结束,如果中途不经过强制释放,持有的内存就会处于占用状态。经过验证,猜想也成立。
基于以上两点,可做的事情就是在尽量不更改游戏引擎正常业务逻辑的情况下,在合理的时机进行资源的强制释放。于是才有了链接中的修改内容。
1、使用laya编辑器 , 2.1.0 版本的,导出生成 2.1.0 版本的ios 工程为基础
为了验证编译导出的laya 二进制文件能否放入到低版本,先对2.1.0 版本ios 工程做了以下修改
改动部分如下:
- 替换laya脚本导出的 libconch.a 文件
- 替换高版本(2.11.0)apploader.js , index.js ,挪动版本 webglPlus.js 到低版本工程
改动后代码可以直接正常运行。
因为改动量比较大,本次修改需要测试人员经过详细测试。
在做iOS 内存分析的时候强烈推荐 iOS Memory Deep Dive
自己也根据相关内容写了一次分,链接地址