Unity项目包体优化经验方法论(Android平台)

news2024/11/25 3:29:29

前言

本篇文章主要讲解对于Unity Android平台也就是APK包体的优化经验,使用哪些工具能够更加便利的定位资源重灾区。本篇讲解的方法中对于Unity资源使用的AssetBundle的方式,如果使用addressable或其他资源管理方式,我还不是很清楚是否适用,没有去验证过。

工具选择

工欲善其事,必先利其器。对于优化包体这项工作,我们需要选择各种工具搭配使用才能准确定位资源重灾区并选择合适的方式进行优化。下面先讲讲我们需要用到的各种工具。

AndroidStudio

AndroidStudio自带APK分析器,我们使用AndroidStudio也主要用到他的APK分析器来分析包体结构以及对比我们的优化效果

只需要将APK拖入AndroidStudio就能够分析APK结构信息 

优化完成后我们还能通过对比两个APK来比较优化效果

关于更多APK分析器的内容可以查看开发文档

 AssetStudio

我们可以使用AssetStudio对资源包进行解包,这里的资源包包括AssetBundle包以及Unity Resources文件打的包(assets/bin/Data/)目录下的资源。

  • 如果项目使用了资源加密,在优化的时候需要暂时先取消,优化后再开启资源加密
  • 由于AssetStudio只支持Windows版本,如果你使用Mac,可以使用Parallels Desktop虚拟机安装或者尝试使用命令行版本UnityPy

只需要加载文件夹就可以解析所有资源,这个工具多数用来反编译爬取资源(这样不可取:),用来辅助优化包体大小也很有用。选择Export->Asset list to XML->All Assets导出所有资源信息的xml格式。

通过这个表我们可以知道这个名字、大小、被哪些资源引用、类型信息。这样我们就可以通过自定义解析代码来分析优化。

Unity工程Editor工具

上面的工具可以让我们知道哪些资源为占用高的资源,确定了之后,我们是能够删除这些资源还是进行资源优化就需要使用到各种Unity Editor内创建的工具了。

资源引用查找工具

https://github.com/blueberryzzz/ReferenceFinder

下载上面这个工具,我们可以通过查找资源的依赖关系,对于哪些没有被使用的模型、贴图、材质球就可以直接删除,方便快捷。

资源引用丢失查找工具

为了防止我们错删误删资源,我们还需要一个安全检查机制,使用一个引用丢失查找工具就很好的帮我们检查。这部分可以去网上找找其他博主附有代码文章,还是有很多分享的,内容大差不差,我这里就不浪费篇幅把代码贴出来了。

AssetBundle Browser

这是一款Unity提供的插件工具,非常强大的工具

Unity Asset Bundle Browser tool | Package Manager UI website

可以很方便的查看资源被打到哪些AB包,并且是否存在多个包引用同一个资源导致的资源重复引入问题

但是由于这个工具用起来很消耗CPU性能,确实有点卡卡的,较为简单的可以直接使用 ReferenceFinder就能解决。

优化思路

从优化方向来看有下面几个方向

  1. 删除APK中没有用到的资源
  2. 重新分配重复打包资源
  3. 优化资源打包参数(TextMeshPro的纹理导出尺寸、图集压缩等级....)

其中重复打包资源这个是不易察觉,并且也可能是导致包体莫名其妙变很大的根本原因,这个问题不光导致包体增大,同时也会导致内存翻倍,优化优先级很高并且回报率也很高。

1.删除APK中没用到的资源

注意这里说的是APK中没用到的资源,意味着已经被打入APK包体内,但是实际上游戏是用不到的资源,如果去找工程没用到的资源,可能会非常多,这些资源如果没有被场景(需要被Build的场景)、AB包、Resources目录下引用就不会被打入最终的APK去。

要删除这些资源可以通过ReferenceFinder查找哪些资源没有被引用,然后删除即可。

2.重新分配重复打包资源

这部分资源的占比如果没有很好的管理,或者在日常开发中严格按照开发流程来做(主要是美术),就很容易出问题。

通过使用AssetBundle Browser工具辅助重新分配出问题的资源。

对于Resources目录下的资源就需要小心处理

警惕Resources资源

在优化包体的时候,注意到assets/bin/Data/这个目录很大,但是由于项目所用到的资源都是AB管理的,理应不这么大,通过AssetStudio查看发现里面包含了字体文件以及项目中用到的TextMeshPro生成的字符资源,最终发现是由于TMP_Settings这个设置文件资源引起的问题,由于这个资源会被TMP插件自动放到Resources目录下,Unity打包就会打进去

如果这里设置了项目中的TMP_Font Asset,恰好这个资源原本已经打了AB包,那此时就会在assets/bin/Data目录下多存在一份全套的字体资源🙃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue + Element UI 前端篇(六):更换皮肤主题

自定义主题 命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。 yarn add element-theme --dev 2.安装chalk主题 安装白垩主题…

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系列单片机具有3通…

RC-u4 相对论大师(bfs求解指定路径)

PTA | 程序设计类实验辅助教学平台 题解&#xff1a; bfs可以求解从根节点到叶子节点的指定路径&#xff0c;这里的vis[]不是为了防止访问到父节点&#xff0c;更多的是为了缩小路径长度&#xff0c;mpp和mp的映射也很巧妙&#xff0c;开始我用的还是map<pair<string,s…

用通俗易懂的方式讲解大模型分布式训练并行技术:流水线并行

近年来&#xff0c;随着Transformer、MOE 架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&…

怎么用conda下载清华源的pytorch(自带cuda的版本)

1&#xff0c;添加镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…

大数据课程K22——Spark的SparkSQL的API调用

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的通过api使用SparkSQL&#xff1b; 一、通过api使用SparkSQL 1. 实现步骤 1. 打开scala IDE开发环境&#xff0c;创建一个scala工程。 2. 导入spark相关依赖…

介绍 dubbo-go 并在Mac上安装,完成一次自己定义的接口RPC调用

目录 RPC 远程调用的说明作用&#xff1a;像调用本地方法一样调用远程方法和直接HTTP调用的区别&#xff1a;调用模型图示&#xff1a; Dubbo 框架说明Dubbo Go 介绍应用 Dubbo Go环境安装&#xff08;Mac 系统&#xff09;安装 Go语言环境安装 序列化工具protoc安装 dubbogo-c…

【VSCode】文件模板创建及使用.md

背景 最近使用VSCode学习Vue项目比较频繁&#xff0c;每次创建Vue文件都要手动写重复代码&#xff0c;特别麻烦&#xff0c;就上网查找自动生成代码的说明&#xff0c;结果发现VSCode有代码模板&#xff0c;怪怪&#xff0c;感觉发现新大陆了(low!)。 配置 打开配置 方式一&a…

通过slam同步建图程序看ros2节点参数传递生效顺序

缘起&#xff1a; ros2 节点参数可以通过启动节点添加&#xff0c;也可以通过launch文件添加&#xff0c;还可以通过配置文件.yaml文件添加&#xff0c;或者是几种方式套用添加&#xff0c;给初学者带来很大的困惑具体是哪个生效了呢&#xff0c;我们拿slam_toolbox 包的onli…

shell脚本介绍

当你进入Linux世界的大门时&#xff0c;就会遇到一个强大而又神奇的工具——Shell。Shell是一种命令行解释器&#xff0c;为你在Linux系统中与计算机进行互动提供了无限的可能性。 学习Shell可以让你获得强大的自动化和脚本编程能力&#xff0c;让你更高效地处理文件和目录、管…

【力扣周赛】第 357 场周赛(⭐反悔贪心)

文章目录 竞赛链接Q1&#xff1a;6925. 故障键盘解法1——直接模拟解法2——双端队列 Q2&#xff1a;6953. 判断是否能拆分数组&#xff08;贪心&#xff09;Q3&#xff1a;2812. 找出最安全路径⭐解法1——多源BFS瓶颈路模型&#xff1f;解法2——多源BFS 倒序枚举答案 并查…

Vue + Element UI 实现权限管理系统 前端篇(四):优化登录流程

完善登录流程 1. 丰富登录界面 1.1 从 Element 指南中选择组件模板丰富登录界面&#xff0c;放置一个登录界面表单&#xff0c;包含账号密码输入框和登录重置按钮。 <template><el-form :model"loginForm" :rules"fieldRules" ref"loginFo…

数字图像处理:亮度对比度-几何变换-噪声处理

文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强 亮度与对比度转换 图像变换可分为以下两种&#xff1a; 点算子&#xff1a;基于像素变换&#xff0c;在这一类图像变换中&#xff0c;仅仅根据输入像素值计算…

真随机数生成器TRNG外设模块详解

真随机数生成器TRNG外设模块详解 文章目录 真随机数生成器TRNG外设模块详解简介原理与机制应用要点时钟源中断源初始化数据 软件支持 简介 国产车规微控制器原厂云途半导体设计和发售的YTM32ME微控制器上集成的真随机数生成器TRNG&#xff08;True Random Number Generator&am…

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有&#xff1a;基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器&#xff08;DSP&#xff09;。 其中&#xff0c;C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…

继承(个人学习笔记黑马学习)

1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …

IDEA爪哇操作数据库

少小离家老大回,乡音无改鬓毛衰 ⒈.IDEA2018设置使用主题颜色 IDEA2018主题颜色分为三种&#xff1a;idea原始颜色&#xff0c;高亮色&#xff0c;黑色 设置方法&#xff1a;Settings–Appearance&Behavior–Appearance ⒉.mysql中&#xff0c;没有my.ini&#xff0c;只有…

计算机视觉中的自监督学习

如何只使用少量标记示例来训练模型&#xff1f; 到目前为止&#xff0c;人工智能所提供的大部分价值都来自于在日益庞大的数据集上训练的监督模型。其中许多数据集都是由人类标记的&#xff0c;这是一项枯燥、耗时、容易出错&#xff0c;有时还很昂贵的工作。自监督学习&#x…

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…

【狂神】SpringMVC笔记(一)之详细版

1.Restful 风格 概念&#xff1a; 实现方式&#xff1a; 使用PathVariable 在url相同的情况下&#xff0c;会根据请求方式的不同来执行不同的方法。 使用RestFull风格的好处&#xff1a;简洁、高效、安全 2、接受请求参数及数据回显 2.1、请求参数 方式一&#xff1a;这里…