Laya Native 性能分析和改造笔记
Laya Native 性能分析和改造笔记
分析和修改步骤:
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 到低版本工程
改动后代码可以直接正常运行。
profile 内存使用情况 (更换后,游戏运行状态) 170M (现象,也同时证明laya已有js 代码可以直接运行在Laya 高版本运行环境)
问题:
在直接更改iOS源码,强制卸载laya部分,表现如下,内存并没有如预期下降。
在profile 里面去查找还持有,存在于内存的一些对象,可以发现如下(两个占用内存的大户)
把相关退出代码搬运到 laya 提供的项目工程中,通过debug方式profile ,能够看到每次重新进入laya 内存部分被重新分配了 30+ M (每一次都会增加,认定引擎侧出现内存泄漏,在于C++或者ObjectC)
比如可以很直观发现下面的泄漏。
优先解决内存占用大户,发现特征是如下,不能指向具体的代码片段,但是也提供了相应的信息,libglxxxx 推测是在OpenGL 侧。(可能是C++ 持有,属于重点怀疑,但是这个库又是iOS自己提供,所以ObjectC 也不能排除)
在一次profile 时候,在资源载入的时候发现了JCLayaGl 和texture2d 的字段,所以怀疑为C++ 本身内存泄漏的可能性又在加强。libglxxxx 这个东西依然存在,可以先做排除法,先不去管texure2d这块儿。
不使用texure2d的最直接方式是不给图片资源,于是,更换为无图片资源小游戏demo,测试如下
依然存在大量的 Gl 字段, 而且还能看到很多 allocated pair to attach … 这货又好像是iOS的内存泄漏
所以基本认定,在iOS Object C 侧,卸载部分存在内存泄漏,在C++侧也大致会存在相应的内存泄漏。那么下面面临的问题就是如何修复。
C++通用内存泄漏部分基本是在于 Init 或者 构造函数 中 new 出一些对象,在析构时候没有干掉,导致一些内存常驻。
Object C 里面也有C++ 类似的地方,alloc 出对象,然后强制引用,导致对象不能正常释放。
所以基本解决的思路就有了,下一步,干活验证。
ios 如下图,现有学生端 profile 内存部分,也能找到在上面魔改的Demo 工程中出现的内存消耗大户,所以laya 本身存在 destory 接口,但是内部逻辑却没有做到位。既然有,那么我们强制析构对象的时机和入口就很明确了。
测试内存和性能比对:
替换修改好的laya二进制到学生端 卸载前
卸载后
明显看到内存能够降下去!!!
具体内存和性能对比
laya 两个版本运行时内存比较
新版本
旧版本
旧有的占用内存量
点击切换,干掉laya
再次拉起
会持续增加
按照 登录→大厅→录播课→回到大厅
新版本二进制,移除laya 时候内存
没有做修改的内存
对比两种二进制,在laya 是否卸载方面内存变化结论
很明显能够看到在切换场景的时候内存有一个很深的释放,因为在释放完成第一个layacontroller之后会重新建立一个新的layaController , 这里会有一个很深的尖角,因为需要载入新的场景和资源,内存会再次上升。因为小游戏在运行时候必须的内存大小基本固定,所以会回归到正常的内存数值。
现有Laya 单利方式在内存表现方面没有太多的增加,在大厅进入到录播AI课的时候会有一定的内存上涨,在从录播AI课回到大厅的时候,一些内存没有释放掉,维持在 396M 左右, 在使用释放laya 的方式,在回到大厅时候,维持大厅刚进入时候的内存值,即 349M 左右。
有一个明显不一样的地方是,如果在新版本中大厅切换到一个空的页面,即无laya 运行时环境,iOS 内存能够从 349M 下降到 85M 左右(如下图), 但是现有的版本,内存无法下降
旧版本如下:
具体时机数值比较
Laya单独一个课件载入到一个新的demo 中
在正常运行时候 191M (这里没有声网,没有录播课中的视频,只是laya 课件), 但是卸载以后,就在 70.3M
就是理论评估,本讲课件暂用内存在 121M 左右。
在学生端这里,从大厅进入—>到AI录播课→回到大厅流程 (在释放laya 对象时候进行延时处理,延时为 5秒 ,可以详细的记录内存的变化)
327 - 137 = 190M (相比上面单独demo 中的 121M ,应该算是合理的)
大厅课件占用内存 353 - 137 = 216 M
关于性能方面初步结论:
在同等环境下,运行时候需要的内存是一致的,但是在于卸载laya 到原生端这里,2.1.0
版本因为laya 引擎自身原因,引擎运行分配出来的内存和JavaScript context,资源内存并没有被释放。导致再次拉起Laya 工程,内存会重新分配,出现严重的内存泄漏。2.11.0 版本,修改以后是可以释放掉laya运行时内存,不会因为多次释放和重新拉起引起内存泄漏。
渲染侧:
暂时还需要低端机器和相关测试环境对比
内存比对
比如线上debug 版本,进入ai课执行空游戏,即载入空场景表现
redirect url 之后内存维持在 169M
如果使用卸载Laya 方式
相当于如果使用修改后的引擎,在不使用Laya 的环境中 相比之前稳定在 169M 的内存, 能够减少 169 - 82.6 = 86.4M , 也就是说可以多出来 86.4M 内存提供给额外业务使用。
后续升级:
现有iOS升级可更改的内容非常少,主要修改点在于:
- iOS 之前单利方式的Laya Controller 更改为对象方式,在需要的时候载入初始化,不需要的时候可以销毁。
- 替换新版本 laya 原生二进制文件(必要)
- JavaScript 部分,修改或者替换apploader.js ,index.js 新增 webglPlus.js
新版本特性:
- 在新版本Laya 代码中使用的是 WkWebview,iOS 可以使用高版本二进制进行新项目提审。
- 支持内存释放,可以做多runtime 引擎之间切换。
- 具备扩展性,可以在现有基础上对引擎底层做特定修改。