Unity场景ab包加载压缩(LZ4,LZMA)格式的测试

2023-11-06 19:52

本文主要是介绍Unity场景ab包加载压缩(LZ4,LZMA)格式的测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

情况

最近场景越来越大,大概800M的场景加载时间可能长达40秒左右,所以需要测试看看发生了什么。

测试环境

测试环境Win10,21thI5-12600KF,32GRam , Nvidia GF RTX2060 32G
Scene1大小:741M

加载代码

首先放上部分的加载场景的代码:

        public float sceneprog;public AsyncOperation sceneAsync;async public Task LoadScene(string path){sceneprog = 0f;await Task.Delay(10);StreamAssetVer sav = GameJsonMain.inst.Get(path);if (sav == null){Debug.LogWarning("不存在的场景:" + path);return ;}if (!sav.isab){Debug.LogWarning("场景isab必须对勾:" + path);return;}float loadtime = Time.realtimeSinceStartup;float computloadtime;float ratetime = 0.9f;//Application.backgroundLoadingPriority = ThreadPriority.Low;Debug.Log("LoadScene - begin ..."+ Application.backgroundLoadingPriority);
#if UNITY_EDITOR && TESTRESstring[] dirs = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle(path);//Object[] listobj = new Object[dirs.Length];if(dirs.Length == 0)Debug.LogWarning("找不到这个资源:" + path);for (int i = 0; i < dirs.Length; i++){string assetPathAndName = dirs[i];LoadSceneParameters ls;ls = new LoadSceneParameters();ls.loadSceneMode = LoadSceneMode.Additive;sceneAsync = EditorSceneManager.LoadSceneAsyncInPlayMode(assetPathAndName,ls);  // .LoadSceneInPlayMode(assetPathAndName, ls);sceneAsync.allowSceneActivation = false;while (sceneAsync.progress < 0.9f){sceneprog = sceneAsync.progress;await Task.Delay(100);Debug.Log("load - " + sceneprog);}//sceneAsync.allowSceneActivation = true;//listobj[i] = null;}sceneprog = 1f;//Debug.Log("load1 - " + sceneprog);computloadtime = Time.realtimeSinceStartup - loadtime;Debug.Log("LoadScene unity- load file time : " + computloadtime);return ;
#endifTask<UnityWebRequest> task;if (sav.include){task = streamingAssetsLoader(sav);}else{task = AssetsLoader(sav);}await task;UnityWebRequest www = task.Result;if (www.result != UnityWebRequest.Result.Success){www.Dispose();return ;}computloadtime = Time.realtimeSinceStartup - loadtime;Debug.Log("LoadScene - load file time : " + computloadtime);//这个LoadFromFileAsync函数的路径不需要file://AssetBundleCreateRequest abRequest;
#if UNITY_EDITORabRequest = AssetBundle.LoadFromFileAsync(sav.savepath.Replace(filelink, ""));
#elseif(Application.platform == RuntimePlatform.Android){abRequest = AssetBundle.LoadFromFileAsync(sav.savepath);}else{abRequest = AssetBundle.LoadFromFileAsync(sav.savepath.Replace(filelink, ""));}
#endifabRequest.allowSceneActivation = false;while (!abRequest.isDone){sceneprog = abRequest.progress;await Task.Delay(100);//Debug.Log("ab:"+ sceneprog);}abRequest.allowSceneActivation = true;AssetBundle ab = abRequest.assetBundle;computloadtime = Time.realtimeSinceStartup - loadtime;Debug.Log("LoadScene - load AssetBundle time :" + computloadtime);//Debug.Log("ab1:ok," + sav.path +" - "+ sav.url);sceneAsync = SceneManager.LoadSceneAsync(sav.path, LoadSceneMode.Additive);sceneAsync.allowSceneActivation = false;while (sceneAsync.progress < 0.9f){sceneprog = ratetime + sceneAsync.progress * (1- ratetime);await Task.Delay(100);//Debug.Log("load:" + sceneprog);}sceneprog = 1f;computloadtime = Time.realtimeSinceStartup - loadtime;Debug.Log("LoadScene - load LoadSceneAsync time :" + computloadtime);await Task.Delay(300);//sceneAsync.allowSceneActivation = true;//SceneManager.LoadScene(ab.GetAllScenePaths()[0]);//Object[] objs = ab. ab.LoadAllAssets();www.Dispose();ab.Unload(false);return ;}

大致代码分为2部分,在编辑器下#if UNITY_EDITOR && TESTRES 使用编辑器加载方式。

首先我们直接用编辑器通过UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle(path);方法来载入,大概需要5.5-7秒时间。为什么AB包需要那么久 ?

异步和同步加载测试

所有有了下面的AB包测试。
因为是AB包下载,所以关闭宏定义TESTRES ,我在想是不是使用了AssetBundle.LoadFromFileAsync来异步加载的,所以比较慢,所以把函数改为了AssetBundle.LoadFromFile,发现:

同步LoadFromFile方式:33秒
异步LoadFromFileAsync方式:38秒

时间都挺长的,发现有一个修改后台CPU级别的函数Application.backgroundLoadingPriority。

  • ThreadPriority.Low - 2ms
  • ThreadPriority.BelowNormal - 4ms
  • ThreadPriority.Normal - 10ms
  • ThreadPriority.High - 50ms
    改为了High,发现测试的结果相差不大。

压缩方式的对比

把场景的AB包我又打包成了无压缩格式和LZ4格式。我们看看测试结论
默认我的场景是LZMA格式

LZMA : 38秒
无压缩: 4.8秒
LZ4 : 4.7秒

结论

LZ4的压缩方式解压速度非常快和无压缩相差不大,压缩后大小比无压缩强的多,这种不需要从公网下载资源的推荐LZ4。

知识点

LZMA通过UnityWebRequestAssetBundle加载的LZMA格式AB包将自动重新压缩为LZ4压缩,并缓存在本地文件系统上。而通过自己写的下载方案,则可以调用AssetBundle.RecompressAssetBundleAsync API重新压缩。

参考:

https://zhuanlan.zhihu.com/p/342694796

Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

https://segmentfault.com/a/1190000019656656

这篇关于Unity场景ab包加载压缩(LZ4,LZMA)格式的测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358726

相关文章

C#中DateTime的格式符的实现示例

《C#中DateTime的格式符的实现示例》本文介绍了C#中DateTime格式符的使用方法,分为预定义格式和自定义格式两类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录DateTime的格式符1.核心概念2.预定义格式(快捷方案,直接复用)3.自定义格式(灵活可控

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Java中接口和抽象类的异同以及具体的使用场景

《Java中接口和抽象类的异同以及具体的使用场景》文章主要介绍了Java中接口(Interface)和抽象类(AbstractClass)的区别和联系,包括相同点和不同点,以及它们在实际开发中的具体使... 目录一、接口和抽象类的 “相同点”二、接口和抽象类的 “核心区别”关键区别详解(避免踩坑)三、具体使

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni