问答 IL2CPP 的内存问题

侑虎科技 · 2020年05月14日 · 1280 次阅读

1)IL2CPP 的内存问题
2)Log 导致的内存泄露问题
3)Profiler 中的 Built_in Resources 中的内存
4)华为 P30 视频播放异常
5)有关 UWA GOT 的疑问


UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Mono

Q:最近看问答上面有个关于 IL2CPP 和 Mono 的对比,看到 IL2CPP 内存冲高会下降。关于这个,我问了 Unity 的官方技术,回答是:你好,Unity 有自己的 GC 机制,为了避免频繁向操作系统申请/释放内存,Reserved Mono 值会保持在一定区间内,达到某些条件或在某些特殊情况才会触发 GC。 又问了性能狗的技术,回答是:内存池管理逻辑都是一样的,属于上层管理一样。它们只是中间语言不一样而已,也是只涨不降。问了其他 2 个大佬,都是说 IL2CPP 冲高会下降。现在很困惑,求解答。

A:看下来题主说的内存冲高不降,涉及两个指标,一个是 Profiler 里的 Reserved Mono,一个是设备内存(PSS)。目前确实没有权威的文档说明这一点,所以下面通过真实数据来说明一下。

先说第一个(Reserved Mono)。

  1. 在 Script Backend 是 Mono 的情况下,如果选择的是旧版本里的 Mono 2.x,或者新版本里的 .Net 3.5(Runtime Version),那么这个值是只升不降的。比如这个数据,Unused 已经很高了,但也不会下降:

  2. 同样在 Script Backend 是 Mono 的情况下,如果选择的是.Net 4.x(Runtime Version),那么这个值是可以下降的(但不确定具体是从哪个版本开始的)。比如这个数据,可以看出虽然会下降,也并不是频繁执行下降操作的:

  3. 最后 Script Backend 是 IL2CPP 的情况下,那么这个值也是可以下降的。比如这个数据,看上去和上面的情况相差不是太大:

而对于第二个,设备内存。这个就和安卓系统的内存管理机制有关了,即使 Unity 把 Reserved Mono 降低了,减少了自身的内存占用,系统也不一定会立即会把这块内存释放,所以这里的行为就很难说清楚了。

该回答由 UWA 提供


Memory

Q:跑了两个多小时,使用 UWA GOT 查看,最大的内存泄漏居然发生在 Debug.LogWarning,这个合理吗?

A:很有可能你的 Log 被索引了,比如被全局变量索引,然后你的 Log 还在不断增加。

该回答由 UWA 提供


Resource

Q:真机调试的时候,Profiler 中的 Built_in Resources 中会显示比如 Arial 字体的占用,请问下这部分的开销需要关注吗?

A:一般都不需要,大部分是 Developement Build 引入的,比如题主所说的 Arial 字体。

该回答由 UWA 提供


Video

Q:在 Unity 2018.3.7 中使用了 Unity 自带的 VideoPlayer 来播放视频,项目和安卓工程进行了融合,在华为 P30 手机上无法播放视频。

  • 视频格式为 Mp4 文件
  • 视频在华为 P30 上单独可以播放
  • 视频放在 Unity 工程的 StreamingAssets 中(因为融合的问题,使用 VideoClip 会导致所有的安卓手机上都无法播放,所以放在这个目录下,通过 URL 传递给 VideoPlayer 播放)

请问有人知道怎么解决吗?或者如果谁手中有华为 P30 可以测试,麻烦帮忙测试一下,或者能帮我给一个运行时候无法播放给的信息提示,感谢。

A1:我们也遇到同样的问题,尝试过:

  • 降分辨率、降码率
  • 放到 Asset 目录下使用内置转码
  • 更换文件格式(WebM)
  • 使用 Android 设置的硬件解码

都没有解决问题,远程调试也看不出异常。后面放弃原生 VideoPlayer 转用播放插件,没有类似问题,目前看起来都挺正常。想来 Unity 内置的解码在部分机型上水土不服,等其他大佬的解答。
感谢王宇@UWA问答社区提供了回答

A2:H.264 Main Profile 4.1 / No CABAC / 2000Kbps / 720p,我们项目用这个视频格式的配置,基本上没出过问题,但是 iOS 上有 3% 左右的闪退率,完全无解。安卓上过滤掉不支持 ES 3.0 的设备(不播放)之后,反而相当地稳。另外,可以考虑国内大厂经常用的 AV Pro 插件,或者日本人经常用的 CRI Video 插件。

感谢郑昊@UWA问答社区提供了回答


Atlas

Q:图集名是 Chapter,但我没有在 UWA GOT 的 Assets 下的 Texture 栏中看到 Chapter 这个 Name。这会是什么原因呢?

A:可能是图集合并没有生效,可以检查一下这个选项。

该回答由 UWA 提供


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册