Unity开发中的注意事项(优化篇)
本篇记录在unity开发过程中的优化项。不定时更新。1,骨骼动画选项:
----------------------------------------------------------------------------------------------
首先我们先理解一下Unity里面的“骨骼动画”。它的概念很贴近现实中的“骨骼”的含义:常见的模型被分解为两个部分:骨骼Bones和蒙皮Mesh。这些以“关节”结构连接在一起的骨头为模型构建起了一套骨架;随着骨架结构的运动变化,模型表面的蒙皮网格也会随着骨架的变动而发生改变.
在Unity中,如果导入的模型有骨骼动画,那么Unity就会自动为对应的网格添加上Skinned Mesh Renderer,来渲染这些骨骼动画。蒙皮网格渲染器组件会将模型的网格(Mesh)与骨骼节点绑定起来,当骨骼动画播放时,网格的顶点会随着它所绑定的骨骼进行运动,这便形成了“皮肤”随骨骼运动的效果.
运动向量(Motion Vector)的概念来源于视频压缩领域,通俗地理解,运动向量描述了在屏幕空间中,每个像素所对应的物体在连续两帧之间的运动“速度”,该“速度”值等于该像素块在这帧的位置减去在上一帧的位置,也就是当前像素下的片元在相邻两帧之间,屏幕空间位置的差。
Unity中,在Mesh Renderer与Skinned Mesh Renderer组件中都可以开启Motion Vector,用以获取物体的运动信息。若开启,相机会在渲染管线中增加一个motion vector pass,将运动向量渲染在一个Buffer当中,用户可以将Shader脚本中这个Buffer用于后处理特效。Motion Vector一般会用于运动模糊这样的后处理特效、基于时间的抗锯齿算法(temporal antialiasing)等。但是Motion Vector带来的显存中的双倍buffer开销和运算量开销是不容忽视的。而Skinned Motion Vector在移动端项目当中的应用也是很少的,一般不建议开启。
2.AnimationClip
在项目的实际运行中,AnimationClip资源是运行时加载频率最高的资源之一。AnimationClip的压缩格式决定了其包体大小、运行时占用内存大小以及加载效率。
Optimal压缩方法虽然可能会造成动画质量稍有降低的问题,但内存占用是最低的,所以是我们最推荐的方案。
单个AnimatorController下挂载的AnimationState数量过大,会给CPU运算带来一定的压力.所以做的时候注意animationState的数量,一般不要超过30.在展示模型界面上只用到展示动作的时候可以考虑将动画分开,只加载单个展示动画。同时动画的精度也可以做一定限制,可降低包体大小和内存使用。
-----------------------------------------------------------------------------------------------
Shader:
变体:从设计角度讲,代码应该尽可能复用,shader中的关键字(KeyWord)就位我们提供了这种功能。
开发人员在写Shader时,可以在Shader的代码段中去定义一些关键字,然后在代码中根据关键字开启与否,去控制物体的渲染过程。如此一来同一份Shader源码就可以具备多种不同的功能。另外,我们可以在Runtime通过开启或关闭关键字的方式动态改变渲染效果。
这样在项目最终编译的时候,引擎就会根据不同的关键字组合去生成多份Shader程序片段。每一种关键字组合对应生成的程序就是这个原始Shader的一个变体(Variant)。
通俗地说,Shader中的关键字就是一个个标签,方便材质在渲染时绑定不同的Shader变体,实现不同的效果.从变体生成特点上可分为“multi_compile”和“shader_feature”两类,从作用范围角度可分为局部关键字和全局关键字。
multi_compile在编译地时候会把多有的关键字变异成变体,shader_feature只会把用到的关键字编译成变体,也就是说不能再runtime改变渲染效果。
总之变体越多,占用内存越大。加载也就越慢。
对Unity项目而言,Shader变体有其存在的积极意义。除了代码的共用与运行时渲染效果的动态改变之外,还增加了Shader程序在GPU上的执行效率。
对GPU来说,处理类似于“if-else”结构的分支语句不是它的强项,GPU的特点和功能决定了它更适合去并列地“执行”重复性的任务,而不是去“选择”。所以Shader变体的存在就很好地解决了这个问题,GPU只需要根据关键字去执行对应的Variant内容就可以,避免了性能下降的可能。同时,项目在运行时,可以通过在代码中选择不同的Shader变体,从而动态地改变着色器功能。
由于Unity支持的全局关键字的总数有限(256个全局关键字,64个局部关键字),而Unity内部关键字已经占用了约60个“名额”,所以我们建议开发团队尽可能使用局部关键字(shader_feature_local和multi_compile_local)。
页:
[1]