2014-12-22 21:53:14 qq617119142 阅读数 1810

减少文件大小

Unity 后处理所有导入的资源

Unity 始终后处理导入的文件,因此,在使用多层 psd 文件代替 jpg 储存文件,对将要部署的播放器大小没有任何影响。保存文件为正在使用的格式(例如 .mb 文件、.psd 文件、.tiff文件)将使得工作更加轻松简单。

Unity 剔除未使用的资源

工程文件夹中的资源数量不会影响所构建播放器的大小。Unity 可以非常智能地检测哪些资源已在游戏中使用,而哪些没有使用。Unity 在构建游戏之前会跟踪所有资源的引用,并生成一个需要包含在游戏中的资源列表。因此,可以将未使用的资源安全保存在工程文件夹中。

Unity 输出已使用文件大小的概述

Unity 完成构建播放器之后,将输出概览,说明占据最大文件尺寸的资源类型,它也将输出包含在游戏构建中的资源。只需打开编辑器控制台日志便可查看:单击控制台窗口(窗口 (Window) -> 控制台 (Console))中的打开编辑器日志 (Open Editor Log) 按钮。

Unity3D技术之Advanced减少文件大小详解 - 第1张  | 游戏开发网-最好的游戏编程开发技术网站!

文件标题不属于资源,但代表用来维持资源引用和设置的数据,如资源资产。换言之,它是文件中除原始数据内容以外的附加数据。通常,它占据的比例很小,如果数值较大,就应该检查资源 (Resources) 文件夹中是否包含资产。如果是,可以将部分或所有文件移出文件夹。可以切换到使用资源包 (AssetBundles) 以动态加载资源。

优化纹理尺寸

通常纹理会在构建中占用大量空间。首先要做的是在可能的地方压缩纹理格式(DXT(台式机平台)或 PVRTC)。

如果压缩之后纹理尺寸依然没有变小,请试着减少纹理的大小。这里有个技巧:不需要修改实际的源内容,只需在项目视图的导入设置 (Import Settings) 菜单下选择最大纹理尺寸 (Max Texture Size)。这样就可以放大使用此纹理的对象,然后调整最大纹理尺寸 (Max Texture Size),直到对象在场景视图 (Scene View) 中画质变差为止。

Unity3D技术之Advanced减少文件大小详解 - 第2张  | 游戏开发网-最好的游戏编程开发技术网站!
更改最大纹理尺寸不会影响纹理资源,它只会影响游戏的分辨率

纹理究竟占用多少内存?

Unity3D技术之Advanced减少文件大小详解 - 第3张  | 游戏开发网-最好的游戏编程开发技术网站! Desktop

压缩 内存消耗
RGB Compressed DXT1 0.5 bpp (bytes/pixel)
RGBA Compressed DXT5 1 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

Unity3D技术之Advanced减少文件大小详解 - 第4张  | 游戏开发网-最好的游戏编程开发技术网站! iOS

压缩 内存占用
RGB Compressed PVRTC 2 bits 0.25 bpp (bytes/pixel)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

Unity3D技术之Advanced减少文件大小详解 - 第5张  | 游戏开发网-最好的游戏编程开发技术网站! Android

压缩 内存占用
RGB Compressed DXT1 0.5 bpp (bytes/pixel)
RGBA Compressed DXT5 1 bpp
RGB Compressed ETC1 0.5 bpp
RGB Compressed PVRTC 2 bits 0.25 bpp (bytes/pixel)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

纹理总大小:宽 * 高 * bpp。 如果使用 Mipmap 增加 33%。

默认情况下,Unity 会在导入时对纹理进行压缩。为了加速工作,可以在首选项 (Preferences) 中关闭此功能。但在构建游戏时,所有尚未被压缩的纹理都将被重新压缩。

优化网格和动画尺寸

您可以压缩网格和导入的动画片段,以便在游戏文件中占用较小的空间。压缩可以在网格导入设置 (Mesh Import Settings) 中打开。

网格和动画压缩使用量化,这意味着它会占用较小的空间,但压缩可能产生一些误差。应通过实验确定哪个级别的压缩是模型可以接受的。

请注意:网格压缩只会产生较小的数据文件,在运行时不会使用较少内存。动画的关键帧 (Keyframe) 减少可以产生较小的数据文件,并在运行时使用较少的内存,一般都应该使用关键帧减少。

此外,您可以选择不把法线和/或切线存储在网格中,这样可以节约运行时在游戏构建和内存中占用的空间。可以在网格导入设置 (Mesh Import Settings) 中的切线空间生成 (Tangent Space Generation) 下拉菜单中进行设置。经验法则:

  • 切线用于法线贴图。如果不使用法线贴图,则无需在网格中存储这些切线。
  • 法线用于照明。如果某些网格不使用实时照明,则无需将法线存储在网格中。

减少播放器包含的 dll 文件

在构建播放器时(台式机、Android 或 iOS)有一点非常重要,也就是不要依赖 System.dll 或 System.Xml.dll。Unity 的播放器安装中不包含 System.dll 或 System.Xml.dll。这意味着,如果想要使用 Xml 或 System.dll 中的通用容器,那么必要的 dll 文件将包含在播放器中。这通常使得下载文件大小增加 1mb,这显然无益于播放器的分发,因而应该避免使用。如需解析一些 Xml 文件,可以使用更小的 xml 库,如 Mono.Xml.zip。大多数通用容器都包含在 mscorlib 中,Stack<> 和其他一小部分位于 System.dll。因此,应该尽量避免。

Unity3D技术之Advanced减少文件大小详解 - 第6张  | 游戏开发网-最好的游戏编程开发技术网站!
正如所见,Unity 在构建播放器时包含了 System.Xml.dll 和 System.dll。

在播放器分发包中,Unity 包含了如下的 DLL:mscorlib.dll、Boo.Lang.dll、UnityScript.Lang.dll 和 UnityEngine.dll。

2016-11-15 14:44:02 zhangyx_Xyz 阅读数 321

一、AssetBundle是什么?

AssetBundle是Unity pro提供的一种用来存储资源的文件格式,通过把一系列的资源文件或者场景文件使用LZMA压缩方式得到(不清楚LZAM的自行百度)。
AssetBundle 由 Unity 编辑器在编辑环境中(enit-time)创建,可以被用在项目的运行环境中(run-time)。可以存储任意一种Unity引擎能够识别的资源(也就是asset,脚本除外),如模型文件(models)、材质(materials)、纹理(textures)和场景(scenes)等等,同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将自定义文件的扩展名改为.bytes,Unity就可以把它识别为TextAsset,进而就可以被打包到AssetBundle中。
AssetBundles 可以预缓存(pre-cached)和存储在本地,这样在运行时就可以立即加载它们。但是 AssetBundles 技术的主要的目的是在需要的时候能够从远端的服务器上按需请求特定的资源,并加载到游戏中。
AssetBundle的特点总结就是:压缩(缺省)、动态载入、本地缓存;
唯一的例外是,脚本资源是不被允许的(只能保存资源文件对脚本的引用关系)。


二、AssetBundle VS Resource

从本质上来说,利用Unity开发的游戏加载传统资源和AssetBundle本质上并没有什么区别,都是解析各种资源构成应用场景,但是我们都知道,一但Unity应用打包过后,资源文件夹(Resource文件夹)就消失了,都被打包进了应用程序里面.


但AssetBundle作为Unity官方推崇的资源更新方案,与传统的Resource差异如下:


  • Resource放在Resources目录下,resources.assets文件,单个文件有2GB限制,首次必须全部下载;
  • AssetBundle创建需要通过Editor脚本创建,支持动态下载,是Unity Web Caching License唯一可以缓存的内容。

三、AssetBundle的依赖结构


一个通俗点的例子,你有一个Cube你给与了他一个蓝色的材质(blueMaterials),你在加载Cube之前必须先加载了blueMaterials,否则就会材质丢失,即Cube依赖blueMaterials,实际中模型往往非常复杂,那么依赖关系对应的也更加复杂。

所以依赖关系的处理是AssetBundle的一个重要的部分,好在新版本(5.x及以上)中更新AssetBundle系统,可以更好的帮我们处理这些依赖关系。


四、AssetBundle的适用平台与跨平台性

AssetBundle适用于多种平台,包括网页应用、移动应用、桌面应用等,可以动态更新,但不同平台所使用的AssetBundle并不相同,在创建离线AssetBundle的时候需要通过参数来指定目标平台,相容关系如表所示:

StandaloneWebPlayerIOSAndroid
Standalone
WebPlayer
IOS
Android

五、AssetBundle的打包策略

实际的应用开发中,肯定不可能把所有资源打包成一个AssetBundle包,如何处理这些资源,分类打包,便于更新和维护是一个值得深入思考的问题。


每一个 AssetBundle 都有一些技术开销。AssetBundles 是一些封装资源的文件。这种封装会增大了 AssetBundle 的整体大小,尽管这种大小的增加不会太明显,而且是可测量的。当组织 AssetBundles 时,是更多的小的 AssetBundles 还是更少的大的 AssetBundles 呢?这是需要我们根据自己的项目的实际情况来好好权衡的。更多的小的 AssetBundles 会面临更多的跟踪和创建相关的开销,太少的 AssetBundles 会使单个AssetBundle 本身的大小变大,也会导致它们可能包含一些冗余的数据,且不便于维护。


六、AssetBundle的工作流程


  • 创建AssetBundle;
  • 上传到Server;
  • 游戏运行时根据需要下载(或者从本地cache中加载)AssetBundle文件,这几乎就是热更新的核心所在;
  • 解析加载Assets;
  • 使用完毕后释放;

七、远端Server的AssetBundle下载


Unity引擎提供了两种方式从服务器下载AssetBundle文件,分别是缓存机制和非缓存机制。

缓存机制的主要特点就是下载AssetBundle的时候,该接口会先在本地缓存中查找该文件,看其之前是否被下载过,如果下载过,则直接从缓存中加载,如果没有,则从服务器尽享下载。而非缓存机制通过创建一个WWW实例来对AssetBundle文件下载,下载后的AssetBundle文件将不会进入Unity的缓存区。使用这种方法每次都会从远端服务器下载。



以上就是具体关于AssetBundle的一点简单介绍,具体实战可以参考我之后的博客,这儿只是大概引入一下概念。



2015-02-26 15:30:18 yxriyin 阅读数 2918

         如果你们美术不是很给力的话,是非常容易出现重复资源的情况。那么如果能剔除,当然是最好的了。

        先看下无场景的情况下apk大小:61.4M(这里有一个小插曲,本来是74M的,后来发现有一个jpg竟然占了13兆,仔细看了下发现是贴图采用了真彩色无压缩,所以还是使用压缩的先).

        然后加上所有场景文件,重新打包一个apk,大小变成:153M。

        然后用软件Duplicate Cleaner Free查看下重复文件。

       253个重复文件。

       那么接下来才是重点,怎么剔除呢,直接删掉肯定不行,因为引用这个文件的所有地方都会出错。那么就要按照下面的操作:

      选择一个原始模型,打开其他重复模型场景,将所有的模型改成原始模型,然后删除重复模型,确认后将原始模型拖入common。

       替换fbx比较麻烦,要一个个替换,但图片就相对简单了,只要直接设置就可以了。

       替换fbx的方法:先找到原始fbx,然后替换材质,可以先拖一个正确的到场景中,全部设置材质后,在break掉和prefab的关系,就不会红色了。

       然后比较恶心的是有些fbx替换后直接消失了,也没有红色的提示,这个就只能看你自己先截一张老的场景的图,然后和新的比较。

       public class FindMissing:ScriptableObject
{
    [MenuItem("Tools/FindMissing")]
    static void FindMissingMaterial()
    {
        Transform[] transforms = Selection.GetTransforms (SelectionMode.TopLevel | SelectionMode.OnlyUserModifiable);
        foreach(Transform transform in transforms)
        {
            MeshFilter mesh = transform.GetComponent<MeshFilter>();
            if(mesh != null && mesh.sharedMesh == null)
            {
                mesh.gameObject.SetActive(false);
            }

        }
    }
}

这个脚本可以把有问题的active设置为false.

function CreateObject() {
     var newObj : GameObject = new GameObject();
     newObj.transform.parent = target.transform;

     newObj.hideFlags = HideFlags.HideInHierarchy;
 }
这个脚本我怕弄不回来,就暂时不管了。

然后这真心是一个体力活,诶,下次一定要和美术说好规范。

我搞了一下午,还剩150个重复项,主要的问题还是因为我们场景确实很多,接近40个。

明天继续吧。

       又搞了一天,总算弄好了,不知道有没有漏掉的,不过没有关系,以后可以查漏补缺。看看新的apk大小吧:129M

减少了20+M,算是不错的成果了。


2014-11-13 14:33:00 weixin_30636089 阅读数 1

.assetbundle 资源文件

.unity3D  场景文件

xml、json 静态存储和 还原

AssetBuddle 优点:减小压缩包、资源更新、分开安装包和数据包、AssetBuddle加密不容易被反编译

缺点:读取麻烦 组装麻烦 、各平台打的包互相不兼容、耗内存

转载于:https://www.cnblogs.com/123ing/p/4094895.html

2017-07-21 15:35:59 BeUniqueToYou 阅读数 5767

规则1-1】Assets目录中的所有资源文件名(场景、脚本、预设、模型、网格、纹理、材质、精灵、着色器、音频剪辑、视频剪辑)均采用 大驼峰式命名法 ,即每一个单词的首字母都大写。且使用能够描述其功能或意义的英文单词或词组。

规则1-2】资源文件属于同一类型,需要添加编号加以区别的情况下,采用后缀下划线”_”加两位数字进行编号。
这里写图片描述

规则1-3】Assets目录中不得出现压缩包、PPT、Word文档等与游戏项目无关的资源文件。
规则1-4】Assets根目录下的文件夹分类如下,根据资源文件使用的目的分类:
这里写图片描述
文件夹说明(01-10为自定义文件夹,最后4个为默认目录,即系统可识别文件夹,保证名字丝毫不差):
【01.Scenes】:存放所有场景(Scene)文件,统一管理,方便快速寻找并打开场景。
【02.UI】:存放与游戏界面(UI)相关的资源文件,比如按钮,图标,输入框,列表等。
【03.Environment】:存放与环境相关的资源文件,比如背景,建筑物,地形,天空,树木,水体等。
【04.Characters】:存放与人物相关的资源文件,比如玩家控制的角色,敌人,怪兽,NPC,动物等。
【05.Effects】:存放与特效相关的资源文件,比如粒子系统,摄像头渲染特效,动作特效,技能特效,画面特效等。
【06.Input】:存放与玩家输入相关的资源文件,比如PC输入,触屏输入,游戏手柄输入,自定义输入等。
【07.Network】:存放与网络通讯相关的资源文件,比如服务器连接,网络缓存,即时通讯等。
【08.Database】:存放与数据库操作相关的资源文件,比如本地存储,网络存储等。
【09.Others】:存放暂时不知道如何归类的资源文件。
【10.Test】:存放与游戏测试相关的资源文件,在游戏发布前删除该文件夹。
【Editor】:插件目录,该目录在编译项目时,会优先编译,方便项目中代码调用。
【Plugins】:该目录下的代码可调用Unity Editor 的API,存放扩展编辑器的代码。编译时不会被打包到游戏包中。
【Resources】:项目中默认的资源路径,会直接打包到游戏包中,并且可在脚本中加载该目录下的资源。

规则1-5】二级目录下的文件夹分类如下,根据资源文件的文件类型分类:
这里写图片描述
文件夹说明:
【Animations】:动画 相关的资源文件。
【Animators】:动画控制器 相关的资源文件。
【Audios】:音频 相关的资源文件。
【Materials】:材质 相关的资源文件。
【Models】:模型 相关的资源文件。
【Prefabs】:预制体 相关的资源文件。
【Sprites】:精灵 相关的资源文件。
【Shaders】:着色器 相关的资源文件。
【Scripts】:脚本 相关的资源文件。
【Textures】:纹理 相关的资源文件。

注明:如果该二级目录不存在某个类型的资源文件,可以省略其文件夹,如【02.UI】目录下:
这里写图片描述

规则1-6】三级目录下直接存放相关类型的资源文件,如下【Animations】目录下存放所有的动画文件:
这里写图片描述

减少unity包大小

阅读数 896

没有更多推荐了,返回首页