当前位置: 首页 > news >正文

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)格式的测试

情况 最近场景越来越大&#xff0c;大概800M的场景加载时间可能长达40秒左右&#xff0c;所以需要测试看看发生了什么。 测试环境 测试环境Win10&#xff0c;21thI5-12600KF&#xff0c;32GRam &#xff0c; Nvidia GF RTX2060 32G Scene1大小&#xff1a;741M 加载代码 首…...

私有化部署大模型:5个.Net开源项目

从零构建.Net前后端分离项目 今天一起盘点下&#xff0c;10月份推荐的5个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、BootstrapBlazor企业级组件库&#xff1a;前端开发的革新之路 BootstrapBlazor是一个用于构建现代Web应用程序的开源框架&#xff0c;它基…...

安卓系统手机便签app使用哪一款?

在现代快节奏的生活中&#xff0c;我们经常会遇到各种繁忙的事务和容易遗忘的备忘事项。为避免大家遗忘重要的事情&#xff0c;大家可以在常用的手机上安装记录备忘事项的工具&#xff0c;为了帮助安卓用户高效地记录和管理这些信息&#xff0c;今天我将向大家推荐一款功能强大…...

SpringCloud-Gateway无法使用Feign服务(2021.X版本)

Spring Cloud Gateway 2021.x版本&#xff0c;无法使用Feign调用其他服务接口。 问题原因&#xff1a; 在官网的 issue 里面找到了相关的问题。 How to call another micro-service on GatewayFilterFactory ? Issue #1090 spring-cloud/spring-cloud-gateway GitHubHel…...

基于SSM的建筑装修图纸管理平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

Apache Doris (五十二): Doris Join类型 - Broadcast Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Broadcast Join原理...

Docker从入门到上天系列第四篇:docker平台入门图解与平台架构图解

大神推荐:作者有幸结识技术大神孙哥为好友获益匪浅,现在把孙哥作为朋友分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员。 本专栏简介:话不多说,让我们一起干翻Docker 本文章简介:话不多说,让我们讲清楚Docker的平台入门图解和平台…...

安全防御——四、防火墙理论知识

安全防御 一、防火墙1、防火墙是如何诞生的2、防火墙如何分类2.1 软件型防火墙2.1.1 个人防火墙2.1.2 网关型防火墙 3、硬件型防火墙4、防火墙的技术类型5、代理服务器什么是代理 6、防火墙的接口模式7、防火墙抵御的攻击7.1 DDoS攻击7.2 单包攻击7.3 用户行为不受控7.4 威胁安…...

如何给PPT幻灯片解除密码保护以防止编辑

如果您忘记了ppt幻灯片的密码或无法编辑它&#xff0c;不要担心&#xff0c;提供了一种安全、简单易操作的方法来找回密码或解除限制。具体步骤如下&#xff1a;第一步百度搜索密码帝官网&#xff0c;第二步在用户中心上传需要解密的文件即可。 无论您是使用手机还是电脑&#…...

在linux安装单机版hadoop-3.3.6

一、下载hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/core/hadoop-3.3.6/ 二、配置环境变量 1、配置java环境变量 2、配置hadoop环境变量 export HADOOP_HOME/usr/local/bigdata/hadoop-3.3.6 export HBASE_HOME/usr/local/bigdata/hbase-2.5.6 export JA…...

Hadoop相关

hdfs getconf -confKey dfs.namenode.http-address 查看Hadoop工作端口的信息 hdfs getconf -confKey dfs.datanode.http.address 查看HDFS的NameNode组件的HTTP端口。...

ArcGIS 气象风场等示例 数据制作、服务发布及前端加载

1. 原始数据为多维数据 以nc数据为例。 首先在pro中需要以多维数据的方式去添加多维数据&#xff0c;这里的数据包含uv方向&#xff1a; 加载进pro的效果&#xff1a; 这里注意 数据属性需要为矢量uv&#xff1a; 如果要发布为服务&#xff0c;需要导出存储为tif格式&…...

【Axure高保真原型】树切换动态面板案例

今天和大家分享树切换动态面板的原型模板&#xff0c;点击树的箭头可以打开或者收起子节点&#xff0c;点击最后一级人物节点&#xff0c;可以切换右侧面板的状态到对应的页面&#xff0c;左侧的树是通过中继器制作的&#xff0c;使用简单&#xff0c;只需要按要求填写中继器表…...

安装pr提示VCRUNTIME140.dll丢失的修复方法,3个有效的方法

在学习和工作中&#xff0c;我们经常需要使用到PR和PS。然而&#xff0c;在安装这些软件时&#xff0c;有时会遇到一些错误提示&#xff0c;其中之一就是“VCRUNTIME140.dll丢失”&#xff0c;无法运行启动软件程序。那么&#xff0c;如何解决VCRUNTIME140.dll丢失的问题呢&…...

Linux进程控制(2)

Linux进程控制(2) &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了进程等待收尾内容和进程的程序…...

Android Glide transform旋转rotate圆图CircleCrop,Kotlin

Android Glide transform旋转rotate圆图CircleCrop&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load…...

如何让群晖Audio Station公开共享的本地音频公网可访问?

文章目录 1. 本教程使用环境&#xff1a;2. 制作音频分享链接3. 制作永久固定音频分享链接&#xff1a; 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station&#xff1a; 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…...

生态环境领域基于R语言piecewiseSEM结构方程模型

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…...

spring boot+netty 搭建MQTT broken

一、项目结构 二、安装依赖 <!-- netty包 --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.75.Final</version></dependency><!-- 常用JSON工具包 --><…...

从零开始搭建React+TypeScript+webpack开发环境-使用iconfont构建图标库

创建iconfont项目 进入iconfont官网&#xff0c;完成注册流程&#xff0c;即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标&#xff0c;加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...