unity 微信小程序iOS内存优化与管控经验

原文链接
https://blog.csdn.net/weixin_40137140/article/details/134083407?spm=1001.2014.3001.5501

前言

本篇文章是作者本人通过查看微信unity小程序官方内存优化文档和结合自身项目经验总结所得,会有一定的重复内容,在观看本篇文章之前,请仔细浏览微信官方内存优化文档,否则可能对文章无法理解,如有错误,欢迎指出。

微信unity小程序优化文档:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OptimizationMemory.md

一.unity小程序内存限制

1.轻度游戏:

  • 进程内存 < 1gb
  • UnityHeap < 300MB

2.中重度游戏:

  • 进程内存 < 1.4gb
  • UnityHeap < 450MB

二.unity小程序内存分布

用作者知道的一个中重度游戏(优化一般)做分析:

1.进程内存详情分析:

  • UnityHeap占比只有33%,可操作空间不是特别大
  • 内存浮动主要是大量特效显示,浏览器无法及时释放内存
  • 显存大小并不精准,作者推测所得,实际应该在100~200M之间。
  • WASM编译占比较大,原因是代码和依赖库太多。

2.UnityHeap内存:

  • 缓存空间是用于存储资源对象池,防止资源频繁加载释放,实际资源+缓存空间占比大约在50%。
  • Lua内存和托管堆较大。

3.通过以上信息得出结论:

  • 在进程层面,可以对代码包体,渲染效果,内存浮动方面进行排查优化。
  • 在unity业务层,我们可以对资源,Lua和托管堆进行优化。

三.监控工具

  1. unity profiler监听,真机连profiler才准确,编辑器不准确。
    目前微信连真机profiler的教程。
    工具地址:https://q1doc.yuque.com/kiob3t/gynxh4/eb4qe7
  2. lua profiler插件工具地址:https://github.com/leinlin/Miku-LuaProfiler
  3. unity 微信转换插件的Profiling Memory 内存分析,具体操作信息看微信内存优化官方文档。

  1. 正式包上通过接口获取内存,观察变化,如LuaMemory,NativeReserverd,Total Used Memory
  2. 进程级别: Perfdog、Android Studio、 Mac Xcode Instrument

三.进程内存

  1. 内存分类(照搬微信文档):
  • 基础库+Canvas:在小游戏环境中并不存在DOM,但依然会存在一些基本消耗,比如小游戏公共库,Canvas画布等。典型地,小游戏公共库约占用内存100~150MB,Canvas 画布与设备物理分辨率相关,比如iPhone 11 Promax占用约80MB。

  • Unity Heap: 托管堆、本机堆与原生插件底层内存。举例,游戏逻辑分配的C#对象等托管内存、Unity管理的AssetBundle和场景结构等本机内存、第三方原生插件(如lua)调用的malloc分配。

  • WASM编译: 代码编译与运行时指令优化产生的内存,在Android v8、iOS JavascriptCore中还需要大量内存进行JIT优化

  • GPU内存:纹理或模型Upload GPU之后的显存占用, 由于Unity2021之前不支持压缩纹理,纹理内存会造成明显膨胀。

  • 音频:Unity将音频传递给容器(浏览器或小游戏)后,播放音频时将占用的内存。目前UnityAudio将自动适配微信小游戏,特别地请避免使用fmod播放长音频。

  • 内存浮动:主要是渲染压力大时,浏览器缓存没有及时释放。

  1. 获取手段(单位MB):
  • Unity Heap:微信转换插件的Profiling Memory查看
  • GPU内存:目前作者是通过进程总内存减去其他内存得出
  • WASM编译: 内存大小≈wasm未压缩文件大小*10(注意是未分包情况)
  • 内存浮动:可以使用perfDog或者Instrument测试真机情况下进程最大内存峰值时(特效多的时候)调用wx.triggerGC,查看进程内存下降额度,多测几次就大致得出结论。接口文档:https://developers.weixin.qq.com/minigame/dev/api/base/performance/wx.triggerGC.html
  1. 优化手段:
  • GPU内存:主要是显示效果,RenderTexture或者抓屏,shader效果之类入手。
  • WASM编译: 开启unity代码剔除(裁剪)功能,使用微信分包工具**(中重度游戏必须处理)**,
    XLua Warp生成加上 GEN_CODE_MINIMIZE 宏,减少Warp生成数量,降低代码包大小,微信代码分包地址:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/WasmSplit.md
  • 内存浮动:内存浮动较大的项目可以通过定时调用wx.triggerGC来防止内存突破限制导致崩溃。
  • 音频:使用微信音频

四.UnityHeap内存

  1. 内存分类:
  • TotalHeapMemory: UnityHeap总预分配内存大小
  • DynamicMemory:UnityHeap当前使用上限,受MonoHeap与NativeReserverd 等影响,崩溃直接表现值,只会增长不会下降。
  • NativeReserverd:本机堆(Native)内存分配峰值,集中在unity底层自动分配的内存(主要是资源)。
  • MonoHeap: 托管堆当前使用内存,主要是游戏中各种对象相关的实例内存,如C#数组,List之类堆内存,峰值只增不减,峰值就代表当前内存。
  • LuaMemory: Lua内存,属于第三方插件malloc产生。
  1. 底层分配器:
  • 绿色为空闲内存或碎片,底层分配器会尽量复用
  • 白色为预留部分,可被使用
  • 其他颜色,已被业务使用
  1. 获取手段(单位MB):
  • DynamicMemory ≈ MonoHeap + NativeReserverd + 原生插件内存+30,结果是三个加起来峰值最大的时候
  • NativeReserverd = Profiler.GetTotalReservedMemoryLong()*0.00000095367431
  • MonoHeap = Profiler.GetMonoUsedSizeLong()*0.00000095367431
  • LuaMemory = LuaAPI.lua_gc(L, LuaGCOptions.LUA_GCCOUNT, 0)*0.0009765625
  1. 优化手段:
  • DynamicMemory: 使用定时器,每帧通过上面获取手段的计算方式得出当前DynamicMemory的使用大小,然后决定业务层是否要调用内存释放相关操作,防止Dynamic峰值上升。
  • NativeReserverd:通过资源优化,AB卸载资源释放,Resources.UnloadUnusedAssets操作等,下降峰值。
  • MonoHeap:管控峰值,避免某个操作导致内存急速增长,但是过后又释放,会让托管堆在长时间使用率低,峰值高的情况,导致内存浪费,需要注意的是在WebGL 托管堆主动调用GC无效。
  • 排查lua内存泄露,错误逻辑(循环溢出)导致的内存溢出或者抓着引用不释放。
  1. 排查手段:
  • 使用UnityProfiler和Unity MemoryProfiler检查托管堆与本机堆内存详情。
  • 使用LuaProfiler查看Lua内存详情,排查内存异常增长与内存泄露情况。

五.微信平台导致内存上升的操作(一定要避免!!!)

  1. UnityWebRequest(主要是AB资源的Cache)的 下载缓存接口在WebGL平台上会导致内存爆发式增长,缓存的所有文件都会算进运行内存。文档地址:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OptimizationMemory.md

如下列带Cache的接口:

  1. IO操作,主要集中在后台下载并发过高,文件写入频繁(如日志写入,下载记录写入等操作)导致的内存溢出之类,可以实施的操作有:
  • 增加文件操作句柄接口,防止需要连续写入的文本文件调用WXFileSystemManager.WriteFile频繁创建销毁IO流,速度过慢导致写入数据累积。接口地址:https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html
  • 写入间隔不能太频繁,写入数据量不宜过大。
  • 下载文件也会有IO操作,如果是后台下载之类可以调整并发数。

六.其他一些内存优化方向

  1. 微信小游戏纹理压缩,文档地址:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/CompressedTexture.md
  2. 使用Unity Profiler在真机上排查大资源和废弃资源。
  3. 使用AssetStudio排查大资源,废弃资源和重复资源。重复资源排查工具地址:https://blog.csdn.net/weixin_40137140/article/details/134082859?spm=1001.2014.3001.5501

  1. 增加设置像素比接口,iOS上降低真机像素比,可以有效下降内存,一般设成2就行。

  1. 表格数据去重,在小程序上因为内存比较紧张,某些类型的游戏往往表格数据较多,处理不当内存可能会突破100M,无论是存储在C#还是lua上,都应该对数据进行合并,尤其是大量的字符串,具体算法可以结合自身项目发挥。

  2. unity 图片资源格式关闭Read/Write与Mipmap

谢鱼
关注 关注
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D占用内存太大怎么解决呢? -尾
小小姑娘
11-26 3724
想要减少这部分内存的使用,能做的就是减少使用的库,稍后再说。库剥离可以极大地降低打包后的程序的尺寸以及程序代码的内存占用,唯一的缺点是这个功能只支持Pro版的Unity。关于对象重用,可以参考Unity关于内存方面的文档中Reusable Object Pools部分,或者Prime31有一个是用Linq来建立重用池的视频教程(Youtube,需要翻墙,上,下)。要注意的是这里的调用真的仅仅只是建议,可能系统会在一段时间后在进行回收,也可能完全不理会这条请求,不过在大部分时间里,这个调用还是靠谱的。
Unity3D与微信小程序(游戏)交互
04-25
rank_ecpm_v1~rank_v31_ecpm-8-119605522.142^v9^pc_search_result_cache,157^v4^control&utm_term=unity&spm=1018.2226.3001.4187
unity内存优化之AB包篇(微信小游戏)
03-16
unity内存优化之AB包篇(微信小游戏)
Unity-微信小游戏上架流程-个人开发者
最新发布
qq_61885864的博客
04-12 2720
微信上架流程个人认为比较繁琐,而且严格,时间跨度长。在微信平台上架小游戏,实际上相当于将一个Unity WebGL的工程上架到微信小程序,只不过将微信小程序的类型设置成小游戏,使用微信专门的打包工具打包导出,并且使用微信专门的调试工具进行调试,其中由于微信平台的一些原因,一些字体无法在微信小程序上正常显示,并且棋牌类游戏和RPG类游戏,在微信小程序审核通过率极低,唯一好在一点,就是可以绕过苹果的审核,让ios用户,体验到你的小游戏。
unity项目上传微信小程序遇到问题记录
m0_62995757的博客
04-06 175
一脸懵逼,看了下代码才发现转换成功会弹成功提示,所以是转换未成功。去搜了一圈解决所有报错才行,又仔细看了眼报错发现是gbk编译问题,找了一圈发现是文件夹目录没全英,睿智问题,真是服了。这个比较好解决把color space从线性改成伽马就好了。1.webgl无法生成,提示color space不符。2.没生成minigame文件夹,只有webgl文件。3.今天运行出现资源下载失败问题。搜了一下要清缓存明天再试试。
微信小程序超级占内存_实测:微信小程序究竟会占用多少内存?结果竟然
weixin_39597318的博客
12-19 1962
上图就是小编微信中已经安装的小程序列表、微信占用的内存空间数据。接下来小编安装两个小程序。上图就是安装小程序之后的结果,可以看出,安装程序对内存空间影响几乎没有。(可能是极小,小到可以忽略不计。)结论:安装小程序几乎不会占用内存空间。下面在测试使用小程序的结果,为了能明显的体现出数据的变化,小编选择观看视频和收听电台作为测试主体。(因为在此期间会产生大量的缓存文件)看了一集电视剧之后......听...
说说unity项目的优化
Per Pixel Lighting
02-27 2503
最近由于公司一个项目的需要(马上就上微信了呦),我被临时抓过来搞了一个月的unity。 主要是帮着搞一下性能的优化以及解决一些兼容性问题。因为我之前对Unity和移动开发都不是很了解,所以简单总结一下,积累点经验。 首先是选定基准平台,android是小米1,ios是iphone4。先在小米1上简单的profile了一下,发现android平台的帧率非常不稳,对profile工作影响很
游戏开发-unity 游戏性能优化
s178435865的专栏
11-12 554
unity 性能优化
小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)
isHoMeTown的博客
11-01 1031
大家好,我是HoMeTown,最近要做一个小程序的项目,项目启动之前,回顾自己之前做过的小程序,感觉做的还是不够好,最近学习了一下小程序优化方案,这块总结一份个人笔记,以便参考,同时分享给大家,共勉。
公司unity游戏优化总结
琢韧的专栏
09-03 694
优化是很多应用开发过程中都有的阶段,对于游戏而言,优化工作也是很有必要的一部分,一个好的游戏离不开各方面的优化,至此总结一下优化过程中的经验: 代码优化: 1.为容器初始化容量:当容量不足时扩容的代价是非常昂贵的,所以最好一开始就有一个大概的估计。 2.减少多余的访问,例如Dictionary的使用中我们常常会先用一次ContainsKey再进行访问,相当于访问了两次。使用TryGet替代会更好...
unity转微信小游戏广告demo
05-12
unity转微信小游戏广告demo
unity 微信小程序SDK
09-02
unity 微信小程序SDK
Unity3d 微信小程序(小游戏)项目实现接入广告(banner、插屏和激励广告等)Demo源码
01-28
Unity3d 微信小程序(小游戏)项目实现接入广告(banner、插屏和激励广告等)Demo源码。 建议先看说明:https://blog.csdn.net/qq_33789001/article/details/128775839 广告虽然能够给平台和开发者带来一定的收益,...
iOS开发之Unity游戏在iOS平台运行调研(踩坑)
sail的技术博客
10-23 2319
需求 在现有App上运行自研的Unity游戏 方案 方案一、导出WebGL运行在WKWebView上 方案二、Unity与原生混合开发 官方示例:将 Unity 集成到原生 iOS 应用程序中
Unity项目转微信小游戏 微信小程序保姆教程,繁杂问题解决,及微信小游戏平台简单性能测试
热门推荐
炼丹炉里有煤灰
11-07 1万+
Unity导出微信小游戏 使用教程,疑难问题解决方案 unity微信小程序性能测试 微信小游戏与原生移动android ios平台性能对比测试
Unity常用性能优化
jc15274630894的博客
04-02 1183
Unity常用性能优化
微信小游戏内存优化之填坑篇
weixin_33910137的博客
01-14 2228
2019独角兽企业重金招聘Python工程师标准>>> ...
Unity优化策略(常用优化手段)
qq_51613678的博客
12-08 2862
浅谈Uniy中的常用优化手段
unity 微信小程序 assetbundle
08-30
Unity是一款流行的跨平台游戏开发引擎,可以用于开发各种类型的游戏和应用程序。微信小程序是一种在微信平台上运行的轻量级应用程序,具有快速、高效和便捷的特点。在Unity中使用微信小程序的AssetBundle功能,可以实现更好的资源管理和加载效率。 AssetBundle是Unity中一种打包资源的方式,可以将游戏中的各种资源(如模型、贴图、音频等)打包成一个独立的文件,通过异步加载的方式在运行时进行动态加载和卸载。在微信小程序中使用AssetBundle功能,可以将游戏所需的资源打包成一个bundle文件,然后在小程序启动时进行加载,避免了一次性加载所有资源导致的内存消耗和加载时间过长的问题。 使用AssetBundle可使微信小程序运行时按需加载资源,提高了程序的运行效率和性能。同时,AssetBundle还可以通过版本管理和差异打包的方式,实现资源的增量更新,减少了资源更新的大小和下载时间。 Unity微信小程序的AssetBundle功能的结合,可以使开发者在开发小程序时更加高效地管理和优化游戏资源。通过合理的资源打包和加载方式,可以减少游戏的大小和加载时间,提升游戏的用户体验。此外,通过AssetBundle功能,还可以实现动态更新游戏内容,增加游戏的可玩性和持续性。综上所述,Unity微信小程序AssetBundle是一个强大的工具,可以帮助开发者更好地开发和优化微信小程序的游戏应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 零基础理解四元数,每个游戏入门开发必备知识 3678
  • Unity Shader 圆心颜色渐变扩散shader 3118
  • Unity2018 iOS去除官方启动动画LOGO,播放自定义开场动画 2964
  • JAVA四元数和欧拉角转换,向量四元数旋转。Quaternion,EulerAngles类 2580
  • IOS重写unity Splash,消除黑屏,播放开场动画视频 2263

分类专栏

  • unity 9篇
  • JAVA 2篇
  • 笔记 5篇
  • shader 4篇
  • unity IOS重写Splash 1篇
  • ios 2篇

最新评论

  • imu姿态解算+卡尔曼滤波融合JAVA版(此版本卡拉曼滤波奇点有错误)

    谢鱼: 四元数

  • imu姿态解算+卡尔曼滤波融合JAVA版(此版本卡拉曼滤波奇点有错误)

    fs_wwj: 奇点问题是如何解决的呢?

  • IOS重写unity Splash,消除黑屏,播放开场动画视频

    谢鱼: 你要知道启动成功了,unity动画内置播放结束的时候调用,可以在场景awke里面调用。

  • IOS重写unity Splash,消除黑屏,播放开场动画视频

    Loveinbug: 请问最后一步,unity端 调用的时机是什么时候呢?可不可以直接在iOS代码中调用

大家在看

  • 通信原理抽样定理和PAM调制解调硬件实验 1474

最新文章

  • unity 2021.3 UGUI内存泄露IndexedSet未释放
  • Unity AssetBundle重复资源检查&包体优化辅助工具&AssetStudio扩充工具
  • 零基础理解四元数,每个游戏入门开发必备知识
2023年3篇
2021年3篇
2020年7篇
2019年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司固原网站优化排名多少钱横岗网站建设设计价格鹤壁百度竞价价格南联营销型网站建设推荐南澳关键词按天计费多少钱云浮网站建设报价杭州百度网站优化宿州网站推广方案公司垦利百度标王白山品牌网站设计公司柳州关键词按天计费随州seo网站优化推荐天门关键词排名公司诸城关键词按天收费报价沙井网站推广方案哪家好抚州网站优化软件哪家好莱芜SEO按天收费多少钱淮安百度网站优化多少钱中山seo排名推荐凉山网站推广系统大同百度网站优化推荐潮州至尊标王布吉推广网站公司林芝百度标王报价莆田外贸网站建设公司深圳SEO按天扣费公司哈尔滨网站搜索优化推荐南平网站优化按天计费价格肇庆SEO按天收费价格梧州至尊标王推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化