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)格式的测试
情况 最近场景越来越大,大概800M的场景加载时间可能长达40秒左右,所以需要测试看看发生了什么。 测试环境 测试环境Win10,21thI5-12600KF,32GRam , Nvidia GF RTX2060 32G Scene1大小:741M 加载代码 首…...

私有化部署大模型:5个.Net开源项目
从零构建.Net前后端分离项目 今天一起盘点下,10月份推荐的5个.Net开源项目(点击标题查看详情)。 1、BootstrapBlazor企业级组件库:前端开发的革新之路 BootstrapBlazor是一个用于构建现代Web应用程序的开源框架,它基…...

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

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

基于SSM的建筑装修图纸管理平台
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件: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幻灯片的密码或无法编辑它,不要担心,提供了一种安全、简单易操作的方法来找回密码或解除限制。具体步骤如下:第一步百度搜索密码帝官网,第二步在用户中心上传需要解密的文件即可。 无论您是使用手机还是电脑&#…...

在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中需要以多维数据的方式去添加多维数据,这里的数据包含uv方向: 加载进pro的效果: 这里注意 数据属性需要为矢量uv: 如果要发布为服务,需要导出存储为tif格式&…...

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

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

Linux进程控制(2)
Linux进程控制(2) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了进程等待收尾内容和进程的程序…...
Android Glide transform旋转rotate圆图CircleCrop,Kotlin
Android Glide transform旋转rotate圆图CircleCrop,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. 本教程使用环境:2. 制作音频分享链接3. 制作永久固定音频分享链接: 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station: 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…...

生态环境领域基于R语言piecewiseSEM结构方程模型
结构方程模型(Sructural Equation Modeling,SEM)可分析系统内变量间的相互关系,并通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和广泛的适用性,是近年来生态、进化、环境、地学、…...

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官网,完成注册流程,即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标,加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

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

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: 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?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...