Unity3D WebGL内存优化与缓存管理

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
系列文章目次

untiy知识点




👉媒介

在Unity发布的WebGL项目中,由于频仍加载和删除模子导致欣赏器内存超出。应该怎么办理呢?
大概在Unity项目中频仍实例化和烧毁对象,导致内存不停增长,终极瓦解。精确的做法应该是确保在删除模子时,精确开释资源,比如烧毁GameObject、开释AssetBundle、排除引用等,以便垃圾采取器能采取内存。
在 Unity WebGL 项目中,直接通过代码打扫欣赏器缓存是不可行的(欣赏器出于安全思量不答应网页直接利用缓存)。
博客将会先容怎样实现WebGL内存优化与缓存管理。
渴望这篇博客对Unity的开发者有所资助。
各人好,我是心疼你的齐备,不定时更新Unity开发本领,以为有效记得一键三连哦。
接待点赞批评哦.下面就让我们进入正文吧 !

提示:以下是本篇文章正文内容,下面案例可供参考
👉一、核心题目

频仍加载/删除模子导致内存暴涨的根本缘故原由通常是:
未被精确烧毁的 Unity 资源(如未调用 Destroy())未开释的 AssetBundle未排除的静态引用Unity WebGL 内存管理限定👉二、办理方案

👉2-1、Unity 层内存优化代码

  1. // 销毁 GameObject 并释放资源
  2. void DestroyModel(GameObject model) {
  3.     Destroy(model);
  4.    
  5.     // 释放未使用的资源(重要!)
  6.     Resources.UnloadUnusedAssets();
  7.    
  8.     // 手动触发垃圾回收(WebGL 部分生效)
  9.     System.GC.Collect();
  10. }
复制代码
👉2-2、欺压页面革新开释内存(终极方案)

  1. // 当检测到内存过高时提示用户刷新
  2. public void CheckMemory() {
  3.     if (SystemInfo.systemMemorySize > 500) { // 根据项目调整阈值
  4.         Application.ExternalEval("alert('内存过高,请点击确定刷新页面');");
  5.         Application.ExternalEval("window.location.reload();");
  6.     }
  7. }
复制代码
👉2-3、AssetBundle 加载规范

  1. // 加载 AssetBundle 后务必正确卸载
  2. IEnumerator LoadBundle() {
  3.     using (var bundleLoad = AssetBundle.LoadFromFileAsync(path)) {
  4.         yield return bundleLoad;
  5.         AssetBundle bundle = bundleLoad.assetBundle;
  6.         // ...使用资源...
  7.         bundle.Unload(true); // 重要!彻底卸载
  8.     }
  9. }
复制代码
模子不消的时间在设置true,否则会导致模子看不见
👉2-4、欣赏器层伪缓存清算(通过URL参数)

  1. // 在页面URL添加随机参数强制重新下载资源
  2. function reloadPage() {
  3.     window.location.href = window.location.href + '?r=' + Math.random();
  4. }
复制代码
👉2-5、保举内存监控监控方案

  1. // 在 Unity 中定期打印内存状态
  2. void Update() {
  3.     if (Time.frameCount % 300 == 0) {
  4.         Debug.Log($"Memory usage: {System.GC.GetTotalMemory(false)/1024/1024} MB");
  5.         Debug.Log($"Total allocated: {Profiler.GetTotalAllocatedMemoryLong()/1024/1024} MB");
  6.     }
  7. }
复制代码
关键注意事项
制止静态引用:确保没有静态变量持有已烧毁对象的引用纹理/音频卸载:使用 Resources.UnloadAsset(texture)WebGL 内存设置 :在 Player Settings 中恰当增大 Memory Size使用内存分析工具:通过 Chrome 开发者工具的 Memory 面板分析走漏点如许就可以有效控制 WebGL 项目标内存增长题目。最佳实践仍然是优化资源加载/卸载逻辑,而非依赖欣赏器缓存清算。
👉三、Unity编辑器开启WebGL内存设置

在 Unity 2020 及更新版本中,WebGL 内存设置的位置和方式有所厘革。
办理方案:
从 Unity 2019.3 开始:
旧版 Player Settings > WebGL > Memory Size 被埋伏
内存管理改为通过 Emscripten 编译参数 控制
须要手动设置内存参数
新版设置方法(Unity 2020+)
代码设置:
  1. #if UNITY_WEBGL
  2. [System.Runtime.InteropServices.DllImport("__Internal")]
  3. private static extern void ConfigureMemory(int initial, int maximum);
  4. void Start() {
  5.     ConfigureMemory(512, 2048); // 初始512MB,最大2GB
  6. }
  7. #endif
复制代码
在 Unity 2021 及更新版本中,官方移除了直接表现废弃设置的选项。以下是针对当代 Unity 版本(2020.3 LTS 及更高版本)的完备办理方案:
👉3-1、通过 WebGL 模板欺压设置内存

创建自界说模板
在项目目次中创建文件夹:
Assets/WebGLTemplates/CustomMemoryTemplate
新建index.html文件并添加以下内容:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>${NAME}</title>
  6.     ${WEBGL_LOADER_SCRIPT}
  7. </head>
  8. <body>
  9.     <div id="unity-container"></div>
  10.     <script>
  11.     var script = document.createElement("script");
  12.     script.src = loaderUrl;
  13.     script.onload = () => {
  14.         createUnityInstance(canvas, {
  15.             // 核心内存配置
  16.             dataUrl: "Build/${DATA_FILENAME}.data",
  17.             frameworkUrl: "Build/${FRAMEWORK_FILENAME}.js",
  18.             codeUrl: "Build/${CODE_FILENAME}.js",
  19.             memory: {
  20.                 initial: 512 * 1024 * 1024,  // 初始内存 512MB
  21.                 maximum: 2048 * 1024 * 1024 // 最大内存 2GB
  22.             },
  23.             // 其他参数...
  24.         });
  25.     };
  26.     document.body.appendChild(script);
  27.     </script>
  28. </body>
  29. </html>
复制代码
2.应用模板
打开 Project Settings > Player > WebGL
在 Resolution and Presentation 部门选择刚创建的模板:
CustomMemoryTemplate
👉3-2、通过编译参数直接修改

打开 Project Settings > Player > WebGL
找到 Publishing Settings > Build Configuration
在 Additional Compiler Arguments 添加:
  1. -s INITIAL_MEMORY=536870912 -s MAXIMUM_MEMORY=2147483648 -s ALLOW_MEMORY_GROWTH=1
复制代码
对应512MB初始内存+2GB最大内存

🔍 验证设置是否收效
构建项目后打开天生的 Build/yourProject.framework.js
搜索以下关键字确认参数已应用:
  1. INITIAL_MEMORY: 536870912,
  2. MAXIMUM_MEMORY: 2147483648,
  3. ALLOW_MEMORY_GROWTH: 1
复制代码
⚠️ 告急注意事项
欣赏器限定:
Chrome 最大内存限定约为 4GB
Safari 最大限定约为 1GB
Firefox 最大限定约为 2GB
如果仍然碰到内存题目,发起采取 增量式资源加载战略:
  1. IEnumerator LoadModel(string path) {
  2.     // 先卸载旧资源
  3.     Resources.UnloadUnusedAssets();
  4.     yield return new WaitForEndOfFrame();
  5.     // 加载新资源
  6.     var request = Resources.LoadAsync<GameObject>(path);
  7.     yield return request;
  8.     // 实例化后立即卸载原始资源
  9.     var obj = Instantiate(request.asset as GameObject);
  10.     Resources.UnloadAsset(request.asset);
  11. }
复制代码

👉壁纸分享


👉总结

本次总结的就是实现WebGL内存优化与缓存管理, 有须要会继承增长功能
如能资助到你,就资助点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有题目记得留言批评哦!
不定时更新Unity开发本领,以为有效记得一键三连哦。么么哒!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表