Unity 资源优化

avatar
作者
猴君
阅读量:1

一丶纹理优化

Texture Type

·Default:用于所有纹理的最常用设置。

·Normal Map:法线贴图。

·Editor GUI and Legacy:HUG或GUI。

·Sprite(2D and UI):2D游戏或UI。

·Cursor:鼠标指针格式。

·Cookie:场景光源格式。

·Lightmap:光照贴图。

·Single Channel:单通道纹理。

*通常纹理用Default,法线用Normal Map,UI用Sprite。

Texture Shape

·2D:贴图

·Cube:天空盒

*通常纹理用2D,天空盒用Cube。


Texture Shape为Cube时会增加Mapping设置

Mapping

·Auto:自动配适。

·6 Frames Layout(Cubic Environ ment):标准立方体贴图布局,六个图像排列。

·Latitude Longitude(Cylindrical):将纹理映射到2D维度/经度表示形式。

·Mirrored Ball:将纹理映射为球体形式。

Convolution Type

·None:纹理没有预卷积。

·Specaular:将立方体贴图用作反射探针。

·Fixup Edge Seams:仅在None或Diffuse下可用,在低端平台上解决过滤限制。


sRGB

·Enable:linear space + gamma texture。

·Disable:linear space +no gamma texture。

*默认开启,gamma空间下无影响,一般保持默认。

Alpha Source

·None:无Alpha通道。

·Input Texture Alpha:导入纹理中的Alpha。

·From Gray Scale:从输入纹理RGB的平均值生成Alpha。

Alpha Is Transparency

·指定Alpha是否为透明通道。

*贴图无Alpha通道Alpha Source为None,有Alpha通道Alpha Source为Input Texture Alpha,勾选Alpha Is Transparency。


Adcanced

Non Power of 2

·None:纹理尺寸不变。

·To nearest:纹理缩放为最接近“2的幂”的尺寸大小。例如257*511缩放为256*512。

·To larger:纹理缩放到最大尺寸大小值的“2的幂”的尺寸大小。例如257*511缩放为512*512。

·To smaller:纹理缩放到最小尺寸大小值的“2的幂”的尺寸大小。例如257*511缩放为256*256。

Read/Write Enabled

·是否需要读写图片像素信息,开启后内存消耗增加一倍,默认禁用。

Streaming Mip Maps

·开启后,通过CPU控制,可以只加载部分Mipmap图片以节省内存及显存。

Generate Mip Maps

·开启后,系统会基于纹理在内存中生成不同精度的贴图,根据摄像机距离选择使用哪张贴图。优点是优化显存,减少渲染,缺点是增加内存。

Border Mip Maps

·启用此属性可避免颜色向外渗透到较低MIP级别的边缘,默认禁用。

Mip Map Filtering

·Box:随着Mipmap尺寸减小,MIP级别将变得更加平滑。

·Kaiser:这是一种随着Mipmap的大小下降而对其应用的锐化算法。如果纹理在远处太模糊,可尝试此选项。

Mip Maps Preserve Coverage

·生成的Mipmap的Alpha通道在Alpha测试期间保留覆盖率。

Fadeout Mip Maps

·启用此属性可在MIP级别递进时使Mipmap淡化为灰色。

*纹理尺寸一般是2的n次方,例如128,256,512,1024等。关闭Read/Write,开启Generate Mip Maps(UI图片以图集形式存在,不开启Mip Maps)。


Wrap Mode

·Repeat:在区块中重复纹理。

·Clamp:拉伸纹理边缘。

·Mirror:在每个整数边界上镜像纹理。

·Mirror Once:镜像纹理一次,然后将其钳制到边缘像素。

·Per-axis:选择此选项可单独控制Unity如何在U轴和V轴上包裹纹理。

Fliter Mode

·Point(no filter):纹理在靠近时变为快状。

·Bilinear:纹理在靠近时变得模糊。

·Trillinear:与Bilinear类似,但纹理也在不同的MIP级别之间模糊。

Aniso Level

·以大角度查看纹理时提高纹理质量。


Override For Android

·Max Size:纹理最大尺寸。

·Resize Algorithm:当纹理尺寸大于Max Size时,选择一种算法来缩小纹理尺寸。

·Mitchell:使用Mitchell算法调整纹理的大小。这是默认的大小调整算法。

·Bilinear:使用双线性插值来调整纹理的大小。如果小而锐利的细节在图像中很重要,此设置可以保留比Mitchell更多的这些细节。

·Format:纹理压缩格式

·Compressor Quality:纹理压缩质量

·Fast

·Normal

·Best

·Override ETC2 fallback:不支持ETC2的Android设备上的ETC2纹理解压缩回退重载。

*Max Size可以限制贴图最大尺寸,Format一般为ASTC(4*4最清晰,12*12最模糊)或者ETC2,带Alpha通道的选RGBA,不带的选RGB。


纹理优化总结:

纹理优化的目的是让它们占用的内存尽量的小,内存大小计算公式如下:

纹理内存大小(字节)=纹理宽度*纹理高度*像素字节

像素字节=像素通道数(R/G/B/A)*通道大小(1字节/半字节)

从上面公式可以看到,纹理加载进内存后的大小跟尺寸/像素通道数/通道大小都有关系。

·纹理尺寸:常见的问题就是不管什么角色场景特效UI,都会给上很大的图片,通常大于1024*1024。

·纹理通道:

·去除Alpha通道:适用于不需要Alpha混合或Alpha Test的角色和物件。

·应用单通道图:灰度图,地形高度图,掩码图,Shader掩码图等等。

·使用16位代替32位图。


二丶UI优化

·图片

·建立共享图库。将通用的元素放在公共库,例如按钮/进度条/背景/UI通用元素等。

·用九宫格图代替大块背景图。

·纹理元素通过变换可组合成复合纹理。

·禁用MipMaps。

·图集

图集是一堆小尺寸纹理合成的纹理贴图(如下图)。

Unity自带的SpritePacker和TexturePackerGUI(外部工具)可以很方便的生成和预览图集。

·UI层次

由于UI元素很多,引擎会对他们合批以减少Draw Calls,但合批优化是有条件的:

1. 使用相同的材质。使用引擎默认的UI材质+UI图集可以满足这个条件。

2. 绘制顺序是连续的。UI的绘制顺序通常就是在场景中的节点顺序。

下图有4张UI图片,但它们都用了系统默认材质,都是共享图集的元素,并且它们在场景中顺序也是相连的,所以满足合批优化的条件,最终SetPass Calls(Draw Calls)是1。

在实际制作中,经常会破坏UI合批优化的条件:

1. 同个界面往往会引用自身图集和共享图集,破坏优化条件1。

2. 界面通常都带有文本,而文本通常是引擎自动生成的另外一张或若干张图集, 破坏优化条件1。

3. UI节点层次混乱,不同图集的元素相互交叉,破坏优化条件2。

4. 部分UI元素使用了自定义材质或Shader,破坏优化条件1。

·字体

·控制字体文件数量。

·少用字体特效(阴影/描边/发光等)。

·剔除字库中无用的字形。可以借助FontSubsetGui或FontPruner给字库搜身。


三丶模型优化

·Scale Factor:模型缩放系数

·Convert Units:将模型比例转换位Unity的比例

·Import BlendShapes:导入混合形状

·Import Visibility:导入可见性

·Import Cameras:导入摄像机

·Import Lights:导入灯光信息

·Preserve Hierarchy: 保留层次结构

·Mesh Compression:压缩模型

·Read/Write Enabled: 读写模型

·Optimize Mesh: 确定网格中三角形的排列顺序,以提高GPU性能。

·Generate Colliders: 生成碰撞体

*通常设置为:关闭Mesh Compression,Read/Write Enabled,Generate Colliders,开启

Optimize Mesh。

·Keep Quads: 此选项可阻止Unity将具有四个顶点的多边形转换为三角形

·Weld Vertices: 合并在空间上具有相同位置的顶点,但前提是它们在整体上具有相同的属性(包括UV,法线,切线和顶点颜色)

·Index Format: 定义网格索引缓冲区的大小

·Legacy Blend Shape Normals: 启用此选项可基于Smoothing Angle值来计算法线

·Normals: 定义是否以及如何计算法线

·Normals Mode: 定义Unity计算法线的方式

·Smooth Source: 定义如何确定平滑行为

·Smoothing Angle: 控制是否为硬边拆分顶点,通常值越大,产生的顶点越少

·Tangents:定义如何导入或计算顶点切线

·Swap UVS: 在网格中交换UV通道

·Generate Lightmap UVS: 为光照贴图创建第二个UV通道

·Animation Type

·None: 不存在动画

·Legacy: 旧版动画系统

·Generic: 通用动画系统

·Humanoid: 人形动画系统

·Avatar Definition: 选择获取Avatar定义的位置

·Root node: 选择要用作此Avatar的根节点的骨骼

·Optimize Game Object: 启用此选项,角色的SkinnedMeshRendererjiang将使用Unity动画系统的内部骨架

·Import Constrains: 导入约束

·Import Animation: 导入动画

·Bake Animations: 烘培通过反向动力学(IK)或模拟创建的动画以便推进运动关键帧

·Resample Curves: 将动画曲线重新采样为四元数值,并为动画中的每个帧生成一个新的四元数关键帧

·Anim.Compression: 导入动画时要使用的压缩类型

·Rotation Error: 旋转曲线的减少量,值越小,精度越高

·Position Error: 位置曲线的减少量,值越小,精度越高

·Scale Error: 位置曲线的减少量,值越小,精度越高

·Animated Custom Properties: 导入指定为自定义用户属性的任何FBX属性

·Import Materials: 导入材质

·sRGB Albedo Colors: 在Gamma空间中使用反照率颜色

·Location

·Use Embedded Materials: 将导入的材质保持在导入的资源中

·Use Extemal Materials(Legacy): 将导入的材质提取为外部资源

·Naming

·By Base Texture Name: 使用导入材质的漫射纹理名称来命名材质

·From Model’s Materal: 使用导入材质的名称来命名材质

·Model Name+Model’s Material: 使用模型文件的名称与导入材质的名称相结合来命名材质

·Search

·Use Local Materials Folder: 在本地Materials子文件夹中查找现有材质

·Recursive-Up: 在所有父文件夹中的所有Materials子文件夹中查找现有材质

·Project-Wide: 在所有Unity项目文件夹中查找现有材质

模型优化总结:

一个模型尽量只用一个材质,材质使用的贴图大小要合理,太大浪费内存,太小画质会模糊。建模时,剔除模型内部等不可见的顶点和三角面,合并重叠或相邻的顶点,减少模型的顶点数和面数。模型的顶点和面数做一定的限制。若模型带骨骼动画,需对骨骼数量做限制,单个模型的骨骼数量最好限定70个以内,否正很多低端设备无法支持GPU蒙皮。对模型进行分类,重要模型骨骼数可以多一些,次重要或不重要的更少骨骼数。


四丶其他

·AnimatorCullingMode为AlwaysAnimate

·AlwaysAnimate: 始终为整个角色生成动画,即使对象在屏幕外也为其生成动画

·CullUpdateTransform: 未显示渲染器时,禁用变换组件重定向和反向动力学写入

·CullCompletely:未显示渲染器时,完全禁用动画

*AlwaysAnimate状态下,当角色在屏幕外时,仍会继续产生Update开销。建议将这个选项改为CullUpdateTransforms或CullCompletely。CullUpdateTransforms适用于动画会产生位移的Animator Controller,CullCompletely适用于动画不会产生位移的Animator Controller。

·粒子发射器数量、粒子数量过多

·优化粒子属性。关闭阴影,关闭光照;若可以去掉纹理的Alpha通道,并关闭Alpha Blend和Alpha Test;

·禁用粒子的高级特效。如模型粒子/模型发射器/粒子碰撞体等。

·用最少的粒子效果器。关闭不必要的粒子效果器,采用简单的方式代替。

·控制粒子的材质数量。

·控制粒子的尺寸和贴图大小。可以粒子的尺寸,可以减缓过绘制,控制贴图大小,可以减少带宽和提高渲染性能。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!