系列文章目次
untiy知识点
👉媒介
在Unity发布的WebGL项目中,由于频仍加载和删除模子导致欣赏器内存超出。应该怎么办理呢?
大概在Unity项目中频仍实例化和烧毁对象,导致内存不停增长,终极瓦解。精确的做法应该是确保在删除模子时,精确开释资源,比如烧毁GameObject、开释AssetBundle、排除引用等,以便垃圾采取器能采取内存。
在 Unity WebGL 项目中,直接通过代码打扫欣赏器缓存是不可行的(欣赏器出于安全思量不答应网页直接利用缓存)。
博客将会先容怎样实现WebGL内存优化与缓存管理。
渴望这篇博客对Unity的开发者有所资助。
各人好,我是心疼你的齐备,不定时更新Unity开发本领,以为有效记得一键三连哦。
接待点赞批评哦.下面就让我们进入正文吧 !
提示:以下是本篇文章正文内容,下面案例可供参考
👉一、核心题目
频仍加载/删除模子导致内存暴涨的根本缘故原由通常是:
未被精确烧毁的 Unity 资源(如未调用 Destroy())未开释的 AssetBundle未排除的静态引用Unity WebGL 内存管理限定👉二、办理方案
👉2-1、Unity 层内存优化代码
- // 销毁 GameObject 并释放资源
- void DestroyModel(GameObject model) {
- Destroy(model);
-
- // 释放未使用的资源(重要!)
- Resources.UnloadUnusedAssets();
-
- // 手动触发垃圾回收(WebGL 部分生效)
- System.GC.Collect();
- }
复制代码 👉2-2、欺压页面革新开释内存(终极方案)
- // 当检测到内存过高时提示用户刷新
- public void CheckMemory() {
- if (SystemInfo.systemMemorySize > 500) { // 根据项目调整阈值
- Application.ExternalEval("alert('内存过高,请点击确定刷新页面');");
- Application.ExternalEval("window.location.reload();");
- }
- }
复制代码 👉2-3、AssetBundle 加载规范
- // 加载 AssetBundle 后务必正确卸载
- IEnumerator LoadBundle() {
- using (var bundleLoad = AssetBundle.LoadFromFileAsync(path)) {
- yield return bundleLoad;
- AssetBundle bundle = bundleLoad.assetBundle;
- // ...使用资源...
- bundle.Unload(true); // 重要!彻底卸载
- }
- }
复制代码 模子不消的时间在设置true,否则会导致模子看不见
👉2-4、欣赏器层伪缓存清算(通过URL参数)
- // 在页面URL添加随机参数强制重新下载资源
- function reloadPage() {
- window.location.href = window.location.href + '?r=' + Math.random();
- }
复制代码 👉2-5、保举内存监控 方案
- // 在 Unity 中定期打印内存状态
- void Update() {
- if (Time.frameCount % 300 == 0) {
- Debug.Log($"Memory usage: {System.GC.GetTotalMemory(false)/1024/1024} MB");
- Debug.Log($"Total allocated: {Profiler.GetTotalAllocatedMemoryLong()/1024/1024} MB");
- }
- }
复制代码 关键注意事项
制止静态引用:确保没有静态变量持有已烧毁对象的引用纹理/音频卸载:使用 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+)
代码设置:
- #if UNITY_WEBGL
- [System.Runtime.InteropServices.DllImport("__Internal")]
- private static extern void ConfigureMemory(int initial, int maximum);
- void Start() {
- ConfigureMemory(512, 2048); // 初始512MB,最大2GB
- }
- #endif
复制代码 在 Unity 2021 及更新版本中,官方移除了直接表现废弃设置的选项。以下是针对当代 Unity 版本(2020.3 LTS 及更高版本)的完备办理方案:
👉3-1、通过 WebGL 模板欺压设置内存
创建自界说模板
在项目目次中创建文件夹:
Assets/WebGLTemplates/CustomMemoryTemplate
新建index.html文件并添加以下内容:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>${NAME}</title>
- ${WEBGL_LOADER_SCRIPT}
- </head>
- <body>
- <div id="unity-container"></div>
- <script>
- var script = document.createElement("script");
- script.src = loaderUrl;
- script.onload = () => {
- createUnityInstance(canvas, {
- // 核心内存配置 ▼
- dataUrl: "Build/${DATA_FILENAME}.data",
- frameworkUrl: "Build/${FRAMEWORK_FILENAME}.js",
- codeUrl: "Build/${CODE_FILENAME}.js",
- memory: {
- initial: 512 * 1024 * 1024, // 初始内存 512MB
- maximum: 2048 * 1024 * 1024 // 最大内存 2GB
- },
- // 其他参数...
- });
- };
- document.body.appendChild(script);
- </script>
- </body>
- </html>
复制代码 2.应用模板
打开 Project Settings > Player > WebGL
在 Resolution and Presentation 部门选择刚创建的模板:
CustomMemoryTemplate
👉3-2、通过编译参数直接修改
打开 Project Settings > Player > WebGL
找到 Publishing Settings > Build Configuration
在 Additional Compiler Arguments 添加:
- -s INITIAL_MEMORY=536870912 -s MAXIMUM_MEMORY=2147483648 -s ALLOW_MEMORY_GROWTH=1
复制代码 对应512MB初始内存+2GB最大内存
🔍 验证设置是否收效
构建项目后打开天生的 Build/yourProject.framework.js
搜索以下关键字确认参数已应用:
- INITIAL_MEMORY: 536870912,
- MAXIMUM_MEMORY: 2147483648,
- ALLOW_MEMORY_GROWTH: 1
复制代码 ⚠️ 告急注意事项
欣赏器限定:
Chrome 最大内存限定约为 4GB
Safari 最大限定约为 1GB
Firefox 最大限定约为 2GB
如果仍然碰到内存题目,发起采取 增量式资源加载战略:
- IEnumerator LoadModel(string path) {
- // 先卸载旧资源
- Resources.UnloadUnusedAssets();
- yield return new WaitForEndOfFrame();
- // 加载新资源
- var request = Resources.LoadAsync<GameObject>(path);
- yield return request;
- // 实例化后立即卸载原始资源
- var obj = Instantiate(request.asset as GameObject);
- Resources.UnloadAsset(request.asset);
- }
复制代码 👉壁纸分享
👉总结
本次总结的就是实现WebGL内存优化与缓存管理, 有须要会继承增长功能
如能资助到你,就资助点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有题目记得留言批评哦!
不定时更新Unity开发本领,以为有效记得一键三连哦。么么哒!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|