上期我们学习了最简单的audio音效的优化,接下来我们继续model模型资源的优化,我将汇总各路大神关于模型优化的思路和方法供你和我学习。
首先我们还是要把我们优化的目标重申一遍:
优化的目标
1.文件体积尽可能小
2.内存占用尽可能小
3.画质够用
DCC中模型要求
- Unity 支持多种标准和专有模型文件格式(DCC)。Unity 内部使用 .fbx 文件格式作为其导入链。最佳做法尽可能使用 .fbx 文件格式,并且不应在生产中使用专有文件格式。
- 优化原始导入模型文件,删除不需要的数据
- 统一单位
- 导出的网格必须是多边形拓扑网格,不能是贝塞尔曲线、样条曲线、NURBS、NURMS、细分曲面等
- 烘培Deformers,在导出之前,确保变形体被烘培到网格模型上,如骨骼形变烘培到蒙皮权重上
- 不建议模型使用到的纹理随模型导出
- 如果你需要导入blend shape normals,必须要指定光滑组smooth groups
- DCC导出面板设置, 不建议携带场景信息导出,如不建议导出摄像机、灯光、材质等信息,因为这些的信息与Unity内默认都不同。除非你自己为某DCC做过自定义导出插件。
Unity模型导入流程
原始模型文件对性能的影响点
- 最小化面数,不要使用微三角形(一定要使用lod对原始模型进行调整),三角面尽量分布尽量均匀
- 合理的网络拓扑和平滑组,尽可能是闭包
- 尽量少的使用材质个数 ,材质的增多,同样会使shader和贴图的暴涨
- 尽可能少的使用蒙皮网格
- 尽可能少的骨骼数量, 过多的骨骼数量后期可能会导致CPU和GPU的瓶颈
- FK与IK节点没分离,unity不支持导入的ik骨骼,导出时ik骨骼节点应删除
Unity模型的设置面板:
Model界面
Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子。
Scale Factor:缩放因子(也就是模型导入后大小如果小了或者大了在这里直接改是相当于该模型的大小的,而且在scale那栏里不会有缩放数值)
Convert Units:单位转换(unity默认单位为米,用咱们三维软件做的时候单位不统一的情况下,在这里她会执行一遍单位转换,默认是勾着的)
Import BlendShapes:是否导入BlendShape表情/混合形状。BlendShape表情,主要工作量在美术,美术制作好表情动画之后,导入Unity中按照下面设置播放即可。美术方面:美术额外导出一个FBX,带有蒙皮信息、骨骼动画只保留一个造型、单独面部的动画信息(Morphing),经过测试,只有美术网格、骨骼、蒙皮、Morphing动画一起导出来的Fbx才能保留表情动画信息。导入到Unity中,基础模型要开启Import BlendShape,对应的面部SkinnedMeshRenderer上会多出BlendShape的配置(调整这些值就可以看到表情变化了)。
Import Visibility:可见性是否导入(在编辑模型导出之前可以隐藏模型,隐藏模型选上他了还是可以导出来,勾选上这个在模型拖入场景时,她会显示为隐藏状态);
Import Cameras:摄像机是否导入(在3D软件打好摄像机了,摄像机的信息会存在fbx里)
Import Lights:灯光信息是否导入;(在3D软件打好灯光了,灯光的信息会存在fbx里)
Preserve Hierarchy:保留层次结构(即使此模型只有一个根,也要始终创建一个明确的预制根。通常,FBX 导入会从模型中剥离所有空的根节点作为优化策略。但是,如果您有多个FBX文件,且它们具有相同层次结构的某些部分,则可以使用此选项保留原始层次结构。例如,file1.fbx包含一个装备,而Mesh和file2.fbx包含相同的装备,但仅包含该装备的动画。如果在未启用此选项的情况下导入file2.fbx,则Unity会剥离根节点,层次结构不匹配,并且动画会中断。)
Mesh:网格的属性。
Mesh Compression:设置压缩率级别以减小网格的文件大小。通过使用网格边界和每个组件较低的位深度来压缩网格数据,增加压缩率会降低网格的精度。最好将其调高到尽可能高的水平,而网格物体看起来与未压缩版本没有太大不同。这对于优化游戏大小很有用。(off:不使用压缩;Low:使用低压缩率;Medium:使用中等压缩比;High:使用高压缩比。)
Read/Write Enabled:启用此选项后,Unity会将Mesh数据上传到GPU可寻址的内存,但也将其保留在CPU可寻址的内存中。这意味着Unity可以在运行时访问Mesh数据,并且您可以从脚本中访问它。例如,如果您要按程序生成网格,或者要从网格复制某些数据,则可能要执行此操作。禁用此选项后,Unity会将Mesh数据上传到GPU可寻址的内存,然后将其从CPU可寻址的内存中删除。默认情况下,此选项是禁用的。在大多数情况下,要节省运行时内存使用量,请禁用此选项。
Optimize Mesh:确定网格中三角形的排列顺序,以提高GPU性能。(Nothing:没有优化;Everything:一切让Unity重排多边形和顶点的顶点和索引。这是默认值。Polygon Order:多边形排序仅对多边形重新排序。Vertex Order:顶点顺序仅对顶点重新排序。)
Generate Colliders:启用自动生成网格碰撞器(mesh collider)。
Generate :与几何相关的属性,用于处理拓扑,UV和法线。
Keep Quads:启用此选项可阻止Unity将具有四个顶点的多边形转换为三角形。例如,如果您正在使用“镶嵌着色器”(Tessellation Shaders),则可能要启用此选项,因为镶嵌四边形可能比镶嵌多边形更有效。Unity可以导入任何类型的多边形(三角形到N-gon)。无论此设置如何,具有四个以上顶点的多边形始终会转换为三角形。但是,如果网格具有四边形和三角形(或将N形转换为三角形),则Unity会创建两个子网格来分隔四边形和三角形。每个子网格仅包含三角形或仅包含四边形。提示:如果要从3ds Max将四边形导入Unity,则必须将其导出为可编辑多边形。
Weld Vertices:合并在空间上具有相同位置的顶点,但前提是它们在整体上具有相同的属性(包括UV,法线,切线和顶点颜色)。通过减少网格的总数,可以优化网格上的顶点数。默认情况下启用此选项。在某些情况下,导入网格物体时可能需要关闭此优化。例如,如果您故意有重复的顶点在网格中占据相同位置,则您可能更喜欢使用脚本来读取或操纵单个顶点和三角形数据。
Index Format:定义网格索引缓冲区的大小。注意:出于带宽和内存存储大小的原因,您通常希望将16位索引保留为默认值,并且在必要时仅使用32位,这是“自动”选项所使用的。(Auto:让Unity根据网格顶点数来决定在导入网格时是使用16位索引还是32位索引。这是在Unity 2017.3及更高版本中添加的资产的默认设置。16bit:导入网格时使用16位索引。如果网格较大,则将其划分为<64k个顶点块。这是Unity 2017.2或更早版本中创建的项目的默认设置。32bit:导入网格时使用32位索引。如果您使用的是基于GPU的渲染流水线(例如,使用计算着色器三角形剔除),使用32位索引可确保所有Mesh都使用相同的索引格式。这减少了着色器复杂性,因为它们只需要处理一种格式。)
Legacy Blend Shape Normals:计算法线的旧方法(版本2017.1之前)。在某些情况下,与当前实施方式相比,它给出的结果略有不同。这是所有FBX预制件的默认设置在将项目迁移到最新版本的Unity之前导入。
Blend Shape Normals(2019版本):定义是否以及如何计算混合形状的法线。使用与“法线”属性相同的值。
Normals:定义是否以及如何计算法线。这对于优化游戏大小很有用。(Import:从文件导入法线‘’这是默认选项。如果文件不包含法线,则将对其进行计算。Calculate:计算根据法线模式,平滑度源和平滑角(如下)计算法线。None:禁用法线。如果网格既不是法线贴图也不是实时光照的影响,则使用此选项。)
Normals Mode:定义Unity如何计算法线。仅在将法线设置为计算或导入时可用。(Unweighted Legacy:计算法线的旧方法(版本2017.1之前)。在某些情况下,与当前实施方式相比,它给出的结果略有不同。这是所有FBX预制件的默认设置在将项目迁移到最新版本的Unity之前导入。Unweighted:法线不加权。Area Weighted:法线由面的面积大小加权。Angle Weighted:法线由每个面上的顶角大小加权。Area and Angle Weighted:法线由面的面积和每个面的顶角加权。这是默认选项。)
Smoothing Angle:控制是否为硬边分割顶点:通常,较高的值会减少顶点。注意:仅在非常光滑的物体或非常高的多边形模型上使用此设置。否则,最好在3D建模软件中手动进行平滑处理,然后将“法线”选项设置为“导入”(如上)进行导入。由于Unity的硬边仅基于一个角度,所以您可能会错误地对模型的某些部分进行平滑处理。仅在将法线设置为计算时可用。
Tangents:定义应如何导入或计算顶点切线。仅在将法线设置为计算或导入时可用。(Import:如果将法线设置为导入,则从FBX文件导入顶点切线。如果“网格”没有切线,则它不适用于法线贴图着色器。计算切线空间使用MikkTSpace计算切线。Calculate Tangent Space:如果“法线”设置为“计算”,则这是默认选项。Calculate Legacy:使用传统算法计算切线。Calculate Legacy - Split Tangent:使用传统算法计算切线,并在UV图表上进行分割。如果法线贴图使用此网格上的接缝破坏了照明。这通常仅适用于字符。None:不导入顶点切线。网格没有切线,因此不适用于法线贴图着色器。)
Swap UVs:交换网格中的UV通道。如果漫反射纹理使用光照贴图中的UV,请使用此选项。Unity最多支持八个UV通道,但并非所有3D建模应用程序都导出两个以上的通道。
Generate Lightmap UVs:为光照贴图创建第二个UV通道。
Rig
这一栏也就是我们俗称的骨骼
Animation Type有四个选项,分别是None/Legacy/Generic/Humanoid
- None:没有骨骼(静态物件就选这个)
-
Legacy:使用旧版动画系统。与Unity 3.x及更早版本一样,导入和使用动画。
- Generic:如果您的装备不是类人动物(四足动物或要进行动画处理的任何实体),请使用通用动画系统。Unity选择一个根节点,但是您可以标识另一个骨骼作为“根”节点代替。(用自己的骨骼系统分类)
- Humanoid:如果您的装备是类人动物(它有两条腿,两条手臂和一个头),请使用类人动物动画系统。Unity通常会检测骨架并将其正确映射到头像。在某些情况下,您可能需要更改“头像定义”并手动配置映射。(用unity通用的四足动物骨骼分类,可以动画通用。)
Animation
Materials
Material Creation Mode:里面选项有None、Standard、Import via MaterialDescription (Experimental)
- None:不导入材质
- Standard:导入材质用标准材质球,也就是Standard
- Import via MaterialDescription (Experimental):根据Fbx里面的材质信息分析用的什么材质,比如 Autodesk Interactive
Location:
- Use External Materials (Legacy):使用外部材质,也就是她会直接导出材质到当前materials文件夹
- Use Embedded Materials:嵌入材料,就和prefab似的,可以手动赋予。
Extract Textures和Extract Materials 就是导出材质和贴图。
导出贴图就是在导出FBX时候勾选了 Embed Media 的时候会显示,直接从FBX里导出里面的贴图
Extract Materials 是Location选择Use Embedded Materials时有效。因为刚导入的FBX材质都会在FBX内部,发现不能修改,也不建议这么做,所以需要手动导出来或者手动赋予一个材质。
下面On Demand Remap部分就是一些导出材质或者索引材质的命名规则了。导出之前一定要先设置这部分
Naming这部分就是命名了
- By Base Texture Name:使用主贴图命名
- From Model's Material:使用原本的材质球命名
- Model Name Model's Material:使用模型命名+材质命名
- Search部分是下面Search and Remap按钮查找以有材质自动挂到材质上的索引规则
Local Materials Folder :当前的Materials
- Recursive-Up :从当前文件夹往Assets根目录查找
- Project-Wide:项目所有的位置
下面一堆材质部分就是Location选择Use Embedded Materials时会显示 用来察看已挂在的材质和手动挂载用;
优化过程
- 尽可能的将网格合并到一起
- 尽可能使用共享材质
- 不要使用网格碰撞体
- 不必要不要开启网格读写
- 使用合理的LOD级别
- Skin Weights受骨骼影响个过多
- 合理压缩网格
- 不需要rigs和BlendShapes尽量关闭
- 如果可能,禁用法线或切线
- 多套模型
以下是在处理导入Unity的网格(模型)时要记住的几点。可以根据设置来改进导入模型数据的性能。应注意以下四点。
- 已启用读写Read/Write Enabled
- 顶点压缩Vertex Compression
- 网格压缩Mesh Compression
- 优化网格数据Optimize Mesh Data
1.Read/Write Enabled
第一个网格注释是Read/Write Enabled。模型检查器中的这个选项在默认情况下是禁用的。
如果你不需要在运行时访问网格,你应该禁用它。具体来说,如果模型被放置在Unity中并且只用于播放AnimationClip, Read-/Write Enabled可以禁用。 启用读/写将消耗两倍的内存,因为CPU可访问的信息存储在内存中。请检查一下,因为简单地禁用它将节省内存。
2.Vertex Compression
顶点压缩是一个将网格顶点信息的精度从float改为half的选项。这可以在运行时减少内存使用和文件大小。
但是,请注意,在以下条件下顶点压缩是禁用的 •已开启读写功能 •Mesh Compression是启用的 •启用动态批处理和可适应的网格(少于300个顶点和少于900个顶点属性)
3.Mesh Compression
网格压缩允许你改变网格的压缩比。压缩比越高,文件大小越小,占用的存储空间越少。压缩后的数据在运行时解压缩。因此,运行时的内存使用不会受到影响。 网格压缩提供了四种压缩设置。
- Off:未压缩
- Low:低压缩
- Medium:中等压缩
- High:高压缩
4.Optimize Mesh Data
优化网格数据是一个功能,自动删除不必要的顶点数据从网格。不必要的顶点数据将根据使用的着色器自动确定。这将减少运行时的内存和存储。 可以在“Project Settings -> Player ”下的“Other ”中进行设置。但是可能会导致模型的动画不正确;
这个选项很有用,因为它会自动删除顶点数据,但要注意,它可能会导致意想不到的问题。例如,在运行时切换材质和着色器时,访问的属性可能会被删除,导致不正确的渲染结果。当只绑定网格资源时,不正确的材质设置可能会导致不必要的顶点数据。这在只提供网格参考的情况下很常见,例如在粒子系统中。
5.如果模型未使用法线、切线、光照UV
等,可以设置为None
或取消勾选;
6.勾选Rig
中的Optimize Game Objects
可以优化模型;
7.没有动画的模型取消勾选Animation
中的Import Animation
;
8.通过Anim.Compression
选择合适的动画压缩策略;
今天是2024年11月21日
重复一段毒鸡汤来勉励我和你
你的对手在看书
你的仇人在磨刀
你的闺蜜在减肥
隔壁的老王在练腰
而你在干嘛?