2015-04-08 10:01:27 xfnjlove 阅读数 2450




译官方文档:http://docs.unity3d.com/Manual/ReducingFilesize.html


PDF文档:http://www.rukawa.cn/Uploads/Attachment/ReducingFilesize/ReducingFilesize.pdf


原文地址:http://www.rukawa.cn/index.php?s=/home/article/detail/id/27.html


需要这么做的目的和好处就不多说了。


第一步要做的就是:看看哪些文件是最占空间的,那么它们就是首选优化对象了。


你可以在刚刚完成一次build之后在“Editor Log”中找到这些信息。


如何打开Editor Log:


在Mac上看起来就是这样的了:


可以看出这份log提供了一份资源总括:各种类型资源的总大小,以及所占百分比。同时还降序列出了单个文件的大小。


顺带一提,资源类型中的“File headers”它们并不是资源本身,而是加在原始资源上,用来存储“引用”与“配置信息”的额外数据。通

常可以忽略这些数据的大小,但如果在你的“Resources”文件夹里有着十分庞大的资源文件的话,这些数据也可能会很大。。


这份log可以帮助你鉴定哪些文件是你或许想要删掉或者进行优化的。


不过在开工之前,还需要先了解几点:


1、Unity再编码会把资源导成它自己的内部格式,所以资源源文件的类型是不相干的。比如你有一个多图层的PS纹理,那么在

build之前它就会被拼接、压缩。所以刻意把这份纹理转成PNG格式其实对减少包大小并没有帮助。在开发时还是用最方便的

格式就好了。


2、Unity会在build时去掉那些你的项目中没有使用到的资源,所以不需要我们手动找出来删掉了。但是脚本是不会被删掉的

(不过它们不占资源),还有“Resources”文件夹里的全部资源,也是不会自动帮你删除的(因为Unity无法判断这里面哪些

是需要用到的)。所以我们要确保“Resources”文件夹里的都是我们真正要用到的。当然,你还可以通过动态加载

AssetBundles的方式来代替“Resources”文件夹里的资源,以减少包大小。

一些建议:纹理(Textures)纹理通常会占据大部分空间。第一步要做的就是选用经压缩的纹理格式(DXT 或者 PVRTC)。

如果这样没有减少它的所占用空间,那么试试缩小纹理的尺寸吧。你不需要对资源本身进行修改,只要在 Project 下选中纹理,

然后在 Inspectpr 下设置Max Size就行了。


有一个好办法就是:在场景中找到使用了该纹理的object,放大画面,然后一边降低 Max Size ,一边看场景中的

object,直到它看起来比较糟糕,就可以知道怎样是最合适的了。。



由以上几张图对比来看,我们就能发现,选择512甚至256的Max Size,效果都是可以的,而且资源大小也能有显著的减少。

修改纹理的Max Size并不会影响到资源本身,只是改变了它在游戏里的分辨率。下表列出了不同图片格式所占用空间的大小

(单位bpp:字节/像素)


一张图片的大小计算公式:width * height * bpp,如果你使用的是mipmap贴图,那么其大小将是普通图片的3倍左右。


Unity默认在导入纹理时就会进行压缩,为了在开发时节约时间,我们可以在偏好设置里手动关掉此功能


而在build时,Unity不管你有没有勾选这一项,都会对纹理进行压缩。

网格与动画(Meshes and Animations)网格与导入的动画(Animation Clips)都可以被压缩。在选中一个模型之后,

就可以在Inspector中进行设置了。


不过对它们进行压缩,是可能造成误差的。所以最好先弄清楚什么程度的压缩是可接受范围内的。另外,mesh的压缩仅仅

是减少数据文件的大小,并不会减少运行时的内存消耗。而减少动画关键帧,则会让两者都有所减少,一般情况下我们都

应该开启。

动态链接库(DLLs)默认情况下,Unity只会在build时包含以下dll:


我们应该避免对 System.dll 或者 System.Xml.dll 有所引用,否则还是会在build时包含进来,而它们也会占用数M的空间。


如果在游戏中确实需要解析XML,那么可以使用“Mono.Xml.zip”来代替系统级的dll。此外,大多数泛型容器都已经包含在标准库中,

只有少数几个在System.dll里,所以可能的话,也应该避免使用到它。

减少手机上使用的 .NET 库的大小Unity为移动设备提供了两套 .NET 的

API:.NET 2.0 和.NET 2.0 Subset


.NET 2.0 提供了几乎整套的API功能,但是很多时候游戏都用不上那么多,导致大量多余的代码占用了宝贵的空间资源。为了

避免浪费,我们就可以用Unity提供的 .NET 2.0 Subset(相当于.NET 2.0的一个子集)。为节省资源,这里面很多一般用不到

的例程库都被移除了,所以这一优化也会是很有用的,只是需要确保我们的代码能够正常工作。

可在“Player Settings”中进行设置

2019-01-23 20:09:17 fightsyj 阅读数 3016
Cocos2dx和Unity3D对比
引擎 Cocos2dx Unity3D
包体大小
应用启动速度
是否收费 免费 收费
友好度 版本不太友好,2.x和3.x差异比较大 比较稳定
社区支持 比较强大 很强大
是否开源 开源,可以直接修改底层 不开源
入门难度 偏难,底层C++ 比较容易
难度曲线 较为平滑 直线上升
适用领域 2D,中小型游戏 3D,中大型游戏

总结:从引擎本身来看,Unity3D比Cocos2dx强大很多,适合开发大型3D游戏;但是在开发中小型2D游戏上面,Cocos2dx是不错的选择!

参考:

https://www.zhihu.com/question/23499299/answer/24899792

http://www.benmutou.com/archives/2388

2016-04-18 16:46:46 baidu_28924013 阅读数 3472

众所周知,通过Unity3D开发的手游包体普遍偏大,动则几百M的安装包,而包体大则会导致手游推广的成本增大,也会影响到用户转化率。除去其他因素,用户在选择下载时,会着重关注游戏包体大小,游戏包体体积过大,下载时间长,会让用户取消下载,同时也会考虑到流量的问题。

 

 

因此Unity官方也介绍了几种降低包体大小的方法:

1.替换jpg,使用psd,减少重复资源

2.剔除不必要的资源

3.打包时查看log纪录,由此判断需要减少的文件类型

4.优化,压缩图片,减少图片大小

5.优化,压缩网格和动画,减少文件大小

6.剔除system.dll和system.xml.dll,尽量不要依赖他们,或用其他组件来代替。

 

上面介绍的方法,是对于图片的压缩以及资源的减少,不过这些处理都会极大地影响到了游戏的画面质量和运行时的流畅程度,影响到用户的体验度。

 

针对于目前这种困境,不少的服务商推出了分包技术,而传统的分包是将资源切割,分段下载,进入游戏前进行二次下载;处理游戏包体瘦身时,往往采用删除代码,精简资源甚至作资源取舍的方式;在资源加载时,玩家必须要中断游戏,并在等待中进行缓慢的资源加载。

 

而爱加密提出了全新将“资源进行分段处理”的压缩概念(爱压缩)。可以将Unity3D5.0版本以下的引擎开发的游戏,进行资源分段处理,有效减小包体体积,同时在不影响玩家的体验和游戏性能质量的前提下,实现玩游戏的前10分钟加载全部资源的畅玩无障碍游戏模式,真正实现包体体积的有效瘦身。

 

上述概念所运用的原理就是将资源有效进行拆分,上传至爱加密服务器,在保证游戏能够正常运行的情况下,WiFi/3G网络环境下通过爱加密服务器同步加载剩余游戏资源。从而达到分段处理游戏资源,有效压缩游戏包体大小的目的。

 

爱加密的这项游戏资源包体压缩技术与之前市面上开发出来的压缩技术的区别就是:一、该技术能够智能甄别网络环境,实现资源静默加载,玩家全程无感知;二、真正以实现压缩游戏包体为目的,最高能够实现压缩原本游戏包体大小的80%;三、该技术对游戏安装资源是无损压缩,不影响游戏质量、性能及其稳定性和兼容性,能够将该技术适用于更多的手机机型中。

2019-02-26 02:54:12 Wei_Yuan_2012 阅读数 1540

Unity3D中支持动态字体静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集。动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而静态字体则不会,而且静态字体是图片,字体大小通过缩放来改变。Unity3D也有自带的字体,Windows下自带字体为Arial。如果使用Unity3D的自带字体Arial字体,在某些机型上可能显示不全。因为Arial是英文字体,并不包含中文字体,在程序运行过程中如果遇到字库中没有的字,程序就会从系统的默认字体库中查找对应的文字,如果系统默认的字库中也没有这个字,那么就会造成字体不显示问题。在Android系统中Unity3D默认会去查找名为DroidSansFallback的字体,因为这个字体是Android的默认字体,但是因为Android系统的可定制性,很多手机厂商会去修改默认字体。Android系统是根据字体的文件名称来找字体的,但Unity3D识别字体却是通过字体内部的设置来识别字体的,所以即使在Android手机中有DroidSansFallback.ttf字体,也有可能导致Unity3D找不到这个字体。由于上面的原因,尽量不要使用Unity3D的自带字体Arial,除非你做的游戏是纯英文的。

Unity3D的动态字体:

想要在Untiy3D中使用动态字体,只要把TTF格式字体库导入到Unity3D工程中,然后在需要使用该字体的地方设置字体类型Font为该TTF字体库即可。对于导入工程中的TTF字体库,可以在控制面板中设置一些属性,比如字体大小,渲染模式等。

  

其中,Font Size就是设置字体大小,数值越大,设置文字时字体对应的texture越大。Rendering Mode 设置字体的渲染模式,这个会直接影响字体在游戏中的显示清晰度,Smooth 是渲染字体纹理最快的抗锯齿模式,Hinted Smooth 通过字体像素描边的抗锯齿模式,Hinted Raster 是对于小号字体显示最清晰的无抗锯齿渲染模式,OS Default 是使用系统字体渲染模式,只能用于动态字体,因为静态字体是在打包时候生成的。Character 设置字体库的字体集,比较常用的是Dynamic,选择该项就是动态字体,只要改字体库中有的字体都能显示,另外Custom Set 选项让我们可以自定义只使用字体库中的某些字体集合,如当我们设置如下图,

那么我们就只能使用“1.2.3”三个字符,其他字符即使TTF中有也不显示。当我们设置该选项的时候,其实相当于使用了静态字体库,因为他生成了文字图集和贴图,如上图的Font Material和Font Texture,并且可以在Debug模式下看到该自定义字体图集的UV信息。

Incl.FontData 若勾选,在导出包的时候把字体添加到包中,若不勾选,则不会将该字体打包,程序运行时会从FontNames列表里检索需要的字体,如果没有,字体就不显示。Font Names 这个参数的主要作用是设置替代字体用的,当程序需要某一个字体时,首先会从当前字体查找字符,如果没有,会依次查找FontNames列表里的其它字体,直到找到或者找完为止。

Unity3D的静态字体:

Unity3D的静态字体,也称为自定义字体,它可以支持美术字体。使用Unity3D的静态字体需要先制作静态字体库,可以借助BMFont这个工具来生成字体图集和UV信息,得到png图片和fnt文件。

接下来使用Unity3D生成静态字体库。导入字体图集,勾选Alpha From Grayscal,新建材质球,材质球Shader指定为GUI/Text Shader。

接着创建Custom Font,配置字体UV信息,这个UV信息保存在fnt文件中,如果图集不大可以手动设置一下,如果很大可以通过代码来设置。如果想要在项目中使用静态字体库,则和动态字体一样,在需要使用该字体的地方设置字体类型Font为该静态字体库即可。

参考:

【Unity】UGUI 如何使用CustomFont(自定义字体)

Unity中制作自定义字体的两种方式

拓展:

常见字体格式及TTF文件制作

字体库剥离和精简

2019-01-26 21:23:35 Wei_Yuan_2012 阅读数 1785

有过App Store提审经验的童鞋应该知道,App Store对iOS提审包有一个包体大小的限制,这个限制不仅仅是对Mach-O可执行文件大小限制,还有整包大小的限制,比如“80M”、“150M”,这些包体大小的限制会直接影响到你APP能否成功上传或者玩家方便下载。App Store官方文档中规定,对于整包大小超过150M的App包,可以上传到App Store并发布,但是无法在移动网络下下载,必须在Wifi网络下才能下载;而对于Mach-O可执行文件大小的限制则依据iOS版本有不同的要求,具体如下图:

简单理解就是:

  • 对于iOS7.0以下版本的App,32位+64位指令集的可执行文件之和最大为80M;
  • 对于iOS7.x-iOS8.x版本的App,32位或64位指令集的可执行文件大小都不超过60M;
  • 对于iOS9.0以上版本的App,32位+64位指令集的可执行文件之和最大为500M。

那么怎么查看Mach-O可执行文件的大小呢?上图也给出了答案,解压ipa包,找到app_name.app/app_name就是可执行文件,使用size命令查看一下该文件,即可看到__TEXT部分的大小。

之前对项目Unity升级使支持iOS64位的时候就遇到了一次可执行文件大小超过80M的上传失败,查了下原因,原来是因为Unity4.6.2及之后的版本使用了新的IL2CPP技术,使得最终编译的可执行文件大小激增。测试发现,Unity4.6.2以及之后的几个版本IL2CPP技术还是有挺大的差异,这也导致生成出来的执行文件大小差异比较大,不过不管怎么样项目的可执行文件还是超过80M,不得不对可执行文件的大小进行优化,参考了Unity3D的官方文档App Store官方优化文档,做了一些整理总结。

先讲下怎么优化iOS包可执行文件的大小:

  1. 使用Release版本打包最终发布包,并确保Release模式下的Optimization Level为 Fastest, Smallest [-Os]
  2. Unity的Build Player Setting中,把 Stripping Level 改为 Use micro mscorlib; Stripping Level 有三个等级选项:Strip assemblies,Strip ByteCode 和 Use micro mscorlib。Strip assemblies 等级下,在AOT编译阶段通过分析字节码将未被引用的类或者方法从dll中移除;Strip ByteCode 等级下,所有的.net dll将被剥离为元数据,因为所有代码在AOT阶段已经预编译并链接到主二进制文件中;Use micro mscorlib 等级下,一些组件将从此库中删除,例如Security、Reflection.Emit、Remoting等,内部组件之间的相互依赖性也将最小化。此优化减少了主二进制文件和mscorlib.dll的大小,但它与某些system和system.xml程序集类不兼容,因此请小心使用它。以上三种等级优化是相互累计叠加的,即等级2包含等级1,等级3包含等级2。
  3. Unity的Build Player Setting中,当 Scripting backend 选择 IL2CPP 时,勾选Strip Engine Code;勾选该选项,本地Unity引擎中没有使用的模块和类将被剔除,这有可能导致某些第三方库使用到而该模块或类被删除而有可能导致App闪退。此时Unity有提供了一个配置方案,可以避免被剔除,只需要在Assets目录下添加link.xml,在里面添加不想被剔除的dll的名字。
  4. Unity的Build Player Setting中,把 Api Compatibility Level 选择 .net 2.0 subset
  5. Unity的Build Player Setting中,把 Script call optimization level 选择成 Fast but no exceptions
  6. 删除没用或重复引用的第三方库,或者使用轻量级的第三方库代替原先引用库,比如使用轻量级的json库,如LitJSON
  7. 删除没用代码,比如一些第三方库的Example代码,废弃的系统代码等,通过分析LinkMap文件可以得到Mach-O可执行文件中各个类或库的大小(设置Project->Build Settings->Write Link Map File为YES,并设置Path to Link Map File,build完后就可以在设置的路径看到LinkMap文件了),使用这个工具可以检测无用的OC类,使用这个工具可以得到各个类或库的大小,然后着重优化相应的模块;
  8. 移除非必须使用的.net基础库,使用其它更精简的库代替,如System.xml可以用XMLParserSecurityParser替代(可减少3-5M),System.Linq也尽量不用,其一是容量问题,其二是效率问题,其三是在iphone4s下面可能导致crash的问题。
  9. 分离代码和资源,将资源(如长字符串,表格等)从代码中剥离并将它们放在外部文件中,因为外部文件的压缩效率比将数据编译为二进制文件时要高;
  10. 少用或不用模板,如List,Dictionary这种泛型容器,因为他们会使得il2cpp产生大量代码,提取静态字段,可以把静态字段数组管理,再通过id映射,这个在XLua官方文档中的Hotfix Flag的IntKey标签上看到类似做法的,具体原因应该也是和il2cpp生成代码有关,具体原因如果有知道的小伙伴麻烦评论告知;
  11. 提升iOS的版本,移除不支持的指令集,如不支持armv7则不选择。

根据Unity官方文档描述,一个空Unity项目,如果没有开启包大小优化大概是22M,开启上述优化之后大概是12M,还是有比较大的优化效果的。

一个游戏App中,不用说资源的大小肯定占大头,接下来说下优化iOS包的资源:

  1. 剔除没有使用的图片,对于重复使用的图片新建公共图集;
  2. 使用8bit的png图片代替32bit的png图片或者pvrtc图片;这一步可以省下很大的包大小,因为游戏中很多资源都是32bit的png格式,而一张图片压缩后可以省下1/4的空间。但是也不是所有的png都能压缩成8bit格式,8bit的png图片只有256种不同的颜色,对于照片细节要求很高的就不能使用。png图片压缩可以考虑pngquant这一开源工具,可以使用命令行实现一键打包压缩。
  3. 压缩音效资源,可以使用 MP3格式压缩,这格式目前在Android和iOS上都可以支持,不然还需要处理不同平台的音频转换;
  4. 优化mesh文件,使得单个模型片面数<3000,材质数<3,骨骼数<50。

根据App Store官方文档可知,Xcode 提供可App包大小报告,你只需要:

  1. 创建App包档案(Archive),选择 Product > Archive;
  2. 导出App包,在档案管理器(Archives organizer)界面选择导出档案,点击发布;
  3. 选择“Export for specific devices”,在下拉菜单中选择“All compatible device variants”;
  4. 选择“Rebuild from bitcode”。

这样你就能在导出文件夹中找到“ App Thinning Size Report.txt”这样一个文件,里面包含了每个设备类型的压缩和未压缩包(加上必须资源)的大小。 这个文档的包大小只是一个估计的包在App Store上大小,因为发布过程中ipa包会被进一步加密,这个加密过程会导致包还会稍微再大一些。

参考:

Unity引擎IOS执行档大小优化

ipa包大小之linkMap文件分析

关于ios的ipa包的分析之link map 文件的分析

基于LinkMap分析iOSAPP各模块体积

减少unity包大小

阅读数 896

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