一丶纹理优化
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;
·禁用粒子的高级特效。如模型粒子/模型发射器/粒子碰撞体等。
·用最少的粒子效果器。关闭不必要的粒子效果器,采用简单的方式代替。
·控制粒子的材质数量。
·控制粒子的尺寸和贴图大小。可以粒子的尺寸,可以减缓过绘制,控制贴图大小,可以减少带宽和提高渲染性能。