总结项目优化中两个对包体大小优化比较大的点:

  1. 动画文件
  2. 模型默认材质球

一. 动画文件

对于3d项目模型的动作文件占资源大小还是有蛮大的一部分,所以想在不影响美术要求的情况下能不能对动作文件进行优化,在UWA上还真的发现有前辈已经总结了优化的方法(链接就是),总结来说就是两点:1.压缩浮点数精度  2.去除scale曲线。对比前后.anim文件效果如下:

对于.anim原始文件的大小还是优化很明显的,打bundle后包体大小跟内存大小也相应的减小。

二.模型默认材质球

要优化包体大小,就要清楚知道包里到底有哪些资源,资源在打成bundle后到底有没有冗余,通过 AssetStudio可以查看包里具体的资源, 打开我们打好的bundle所在文件夹,根据Filter Type选项过滤只留Shader类型资源并大小排序,不看不知道,一看吓一跳,内置Standard shader冗余了有两百多个,按每个701900b算总共占据了100M多包体大小,这是非常可怕的。

那么这些Standard shader到底是在哪些bundle包里?为什么会被打进包里?选中资源右键 Show original file 可以看其所在的bundle,通过分析bundle manifest文件得知原来这些Standard shader是模型资源外部导进工程的时候系统赋予了默认材质球,

即使后面做模型预制体的时候使用了美术其它的材质球,这个Standard shader还是会被引用打进bundle。那能不能哪里可以设置让Standard shader只打进一个包里或者说怎样处理不冗余,GraphicsSetting-> always included shader 倒是可以设置,这边设置的shader意思是该shader不会被打进引用它的bundle里,而是会在出包的时候直接当作依赖资源放进游戏包里。我们在GraphicsSetting-> always included shader设置了Standard shader重新打包看下效果:

如意料中的Standard shader全部没了,对比bundle文件夹的大小,少了差不多100M,这总bundle资源大小减的有点多。

不要高兴的太早,我们只是减少了bundle的大小,重新打个apk包你会发现编译的时间好长,而且打的apk包比之前反而大了很多,What?又出了什么鬼问题?查资料发现是由于 GraphicsSetting-> always included shader  设置了内置Standard shader,而Standard shader是有成千上万的变体,被加到always include 的shader会将shader的所有变体打包到游戏,所以在GraphicsSetting-> always included shader  设置内置Standard shader这个方法是行不通的。

那如何处理呢?通常我们模型很少会用Standard shader的材质球,而是用美术给的实际满足效果的shader材质球,所以还有一个办法是去掉模型对默认材质球的依赖,那其实只要在模型导入的时候把模型Renderer引用的材质球置为空就行了,代码如下:

using UnityEngine;
using System.Collections.Generic;
using UnityEditor;public class DeletFbxDefaultMat
{private static Dictionary<string, GameObject> fbxs = new Dictionary<string, GameObject>();public static bool reimportModle = false;[MenuItem("Assets/删除模型默认材质球")]public static void DelFbxDefaultMat(){string[] guids = null;List<string> path = new List<string>();fbxs.Clear();UnityEngine.Object[] objs = Selection.GetFiltered(typeof(object), SelectionMode.Assets);if (objs.Length > 0){for (int i = 0; i < objs.Length; i++){if (objs[i].GetType() == typeof(GameObject)){string assetPath = AssetDatabase.GetAssetPath(objs[i]);GetModel(assetPath);}else{path.Add(AssetDatabase.GetAssetPath(objs[i]));}}if (path.Count > 0){guids = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(GameObject).ToString().Replace("UnityEngine.", "")), path.ToArray());}else{guids = new string[] { };}}for (int i = 0; i < guids.Length; i++){string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]);GetModel(assetPath);}Debug.Log("模型数量:" + fbxs.Count);StartDelete();}static void GetModel(string path){string pathLower = path.ToLower();if (pathLower.EndsWith(".fbx") || pathLower.EndsWith(".3ds") || pathLower.EndsWith(".obj")){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(path);if (go != null){fbxs.Add(path, go);}}}static void StartDelete(){reimportModle = true;int n = 0;foreach (var item in fbxs){UpdateProgress(++n, fbxs.Count, item.Key);AssetDatabase.ImportAsset(item.Key);}reimportModle = false;EditorUtility.ClearProgressBar();AssetDatabase.Refresh();Debug.Log("delete default mat over---");}static void UpdateProgress(int progress, int progressMax, string desc){string title = "Processing...[" + progress + " - " + progressMax + "]";float value = (float)progress / (float)progressMax;EditorUtility.DisplayProgressBar(title, desc, value);}
}public class ModelMatTool : AssetPostprocessor
{private void OnPostprocessModel(GameObject model){if (null == model || !DeletFbxDefaultMat.reimportModle) return;Renderer[] renders = model.GetComponentsInChildren<Renderer>();if (null == renders) return;foreach (Renderer render in renders){render.sharedMaterials = new Material[render.sharedMaterials.Length];}}
}

处理后效果如下:

发现没,模型默认的材质球没了,模型这时候是粉色的,不过没关系我们要的只是模型的mesh而已,我们做预制体的时候只要把美术用的材质球赋予给它就行了,重新打包包体总体减少了90M左右,效果还是可以的。这边有几个点需要注意的:

  1. 模型设置的Import Materials不要打勾
  2. 上面代码处理的是本地工程Library/metadata里的数据,所以出包的时候要在打包工程上处理。

Unity 优化包体大小相关推荐

  1. 【Unity3D插件】Build Report Tool插件,Build报告,优化包体,查看资源占用

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  2. 讨论:如何降低Cocos2d开发的游戏包体大小

    众所周知,通过Cocos2d开发的手游包体普遍偏大,动则几百M的安装包,而包体大则会导致手游推广的成本增大,也会影响到用户转化率.除去其他因素,用户在选择下载时,会着重关注游戏包体大小,游戏包体体积过 ...

  3. Unity - 性能优化 - 包体,内存 - 偏静态资源的优化

    文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...

  4. 【Flutter】从安卓与iOS包体优化到一键自动打包脚本的一条龙服务

    系统信息 System version: MacOS 12 Flutter version: 1.22.5 Dart version: 2.10.4 Android Studio version: 4 ...

  5. 【Unity编辑器扩展】包体优化神器,图片压缩,批量生成图集/图集变体,动画压缩

    功能介绍: 1. 压缩工具支持对图片原文件压缩(支持png/jpg),也支持使用Unity内置图片压缩批量对图片设置压缩参数. 2. 支持以文件夹或及其子文件夹为单位批量生成图集(SpriteAtla ...

  6. Unity 之 解决包体过大问题记录和纹理相关知识点整理

    Unity 之 解决包体过大问题记录和纹理相关知识点整理 一,发现问题: 二,分析问题: 三,解决问题 3.1 问题分析 3.2 解决方案一 3.3 解决方案二 四,相关知识: 4.1 纹理导入: 4 ...

  7. nginx丢弃http包体处理

    http框架丢弃http请求包体和上一篇文章http框架接收包体, 都是由http框架提供的两个方法,供http各个模块调用,从而决定对包体做什么处理.是选择丢弃还是接收,都是由模块决定的.例如静态资 ...

  8. Unity 包体优化之png拆分为JPG和Alpha Mask

    Unity 应用ImageMagical png图片占用空间很大,如果没有透明通道,可以转成jpg,从而使包体变得很小.而有透明通道的图片就没有办法改成jpg了.但是,有一个库,叫ImageMagic ...

  9. 把Unity包体构建到steam的后台

    一 首先到Steamworks去下载需要的SDK,修改sdk\tools\ContentBuilder\scripts里面的俩个vdf文件名 app_build_1000.vdf文件是你游戏软件的,d ...

最新文章

  1. python中类的嵌套_python类的嵌套
  2. 每日一皮:新年好...
  3. python判断两线段是否相交_c语言 判断两直线段是否相交
  4. python获取的html转换为json,python读取XML格式文件并转为json格式
  5. 鸿蒙2.0手机交互体验,鸿蒙 2.0手机应用开发者Beta,来了!全新交互体验
  6. jeecgboot框架简介
  7. 友基-绘影G10数位屏到底是个什么东西呢要不要拆了看看
  8. 高等数学在计算机领域的应用,计算机专业高等数学应用性改革探索论文
  9. Java开发人员2021年的职位描述和职责
  10. 运维小知识---If you insist running as root, then set the environment variable RUN_AS_USER=root......
  11. 【矩阵计算】QR分解-基于Householder变换
  12. win7台式计算机怎么连热点,怎么用台式电脑开热点,电脑怎么开热点win7
  13. 手把手教你使用R语言做出SCI论文中的表二(单因素分析表)(1)
  14. angular ngRoute
  15. 二线制和四线制传感器的区别_两线制、三线制、四线制传感器的区别和原理
  16. java思维导图源代码_如何使用思维导图解读java开源项目
  17. 电路中滤波电容和退耦电容_去耦电路中,耦合电容容量越大越好吗?
  18. 【图像加密】基于混沌系统的图像加密解密matlab源码含GUI
  19. win10系统突然没了WLAN和移动热点解决方法
  20. 目标检测学习笔记2——ResNet残差网络学习、ResNet论文解读

热门文章

  1. Express的使用方法
  2. 轻NAS搭建 - 使用微力同步搭建私人云盘,无需公网IP也能远程访问
  3. 获取一个文件夹下所有的文件名(包括文件夹名)
  4. java如何自定义异常_Java如何实现自定义异常类
  5. union在c语言中的作用,c语言联合union的使用用途
  6. Jetson Nano(1)——笔记本电脑控制
  7. Java编程题之球落地
  8. 中段尾段全段什么意思_汽车排气的头段/中段/尾段是什么意思?
  9. css会对网站排名有影响吗,对网站排名影响最大的因素是什么?
  10. JAVA宠物领养系统计算机毕业设计Mybatis+系统+数据库+调试部署