Unity性能优化_第五章
Unity LODGroup组件、LOD结构体
LOD是Level of Detail的简称,意思是细节层次,它是一种优化技术。
LOD的原理,就是我们可以为一个游戏对象设定多个模型,这些模型消耗的游戏性能由高到低排列。会根据摄像机距离模型的远近自动显示对应的模型。
近的时候显示最精细的模型,距离中等的时候显示没那么精细的模型,远的时候显示粗糙的模型,最远的时候可以隐藏该模型。
使用LOD技术能起到优化渲染性能的效果。但是使用LOD技术也会增加内存占用。
在Unity中可以使用LODGroup组件来实现LOD技术。
LOD级别LOD 0、LOD 1、LOD 2分别表示摄像机从近处看、从中等距离处看、从远处看时,所使用的模型的信息。Culled表示不渲染该模型。
如果右击它们中的一个,点击Insert Before可以添加一个新的LOD级别到渲染条上。
如果右击它们中的一个,点击Delete,则可以删除该LOD级别。
鼠标悬停在两个LOD级别之间,按住鼠标左键,左右拖动,可以调整LOD级别的范围。
点开下方的LOD 0、LOD 1、LOD 2,点击+号可以添加在这种情况下要显示的模型。
把LODGroup组件添加在一个空物体身上。这个空物体身上不添加MeshRenderer组件,也不添加MeshFilter组件,但可以添加碰撞器。如果要添加刚体、脚本等,也可以添加到这个空物体身上的。
这个空物体要渲染的每一个模型都要作为它的子物体,它们的身上要添加MeshRenderer组件和MeshFilter组件,用于渲染这个模型,但是不要给它们添加碰撞器。
在该空物体的LODGroup组件中,点击选中要设置的LOD级别,在Renderers下方点击Add可以选择要显示的游戏对象,点击-号可以移除该游戏对象。
Edit——Project Settings——Quality中有控制整个项目LOD的参数。
LOD Bias的值小,则摄像机离物体的距离稍微有些变化,则不同的LOD级别就会切换。如果LOD Bias的值大,则摄像机需要与物体有比较大的距离变化,不同的LOD级别才会切换。
Maximum LOD Level表示所有LOD Group组件最大能使用LOD级别,超过这个限制的LOD级别的模型不会显示。注意,LOD级别0大于LOD级别1,LOD级别1大于LOD级别2,依次类推。例如把这个值设置为1,则即使摄像机到物体的距离达到了LOD级别为0的范围,则也不会切换到LOD级别为0的模型来显示。例如把这个值设置为2,则即使摄像机到物体的距离达到了LOD级别为0或者LOD级别为1的范围,则也不会切换到这些模型来显示。
LODGroup.crossFadeAnimationDuration float型。控制各个LOD级别之间进行切换的时候,用多少秒进行淡入淡出。 如果赋值为0或者负数,则会报错。
LODGroup型结构体.animateCrossFading bool型。控制各个LOD级别之间过渡的时候,是否有淡入淡出动画。 值为true,则过渡时有淡入淡出动画。 值为false,则过渡时没有淡入淡出动画。
LODGroup型结构体.enabled bool型。是否启用这个LODGroup组件。 值为true,则这个LODGroup组件才能正常工作。 值为false,则这个LODGroup组件将不起作用,不会根据摄像机的距离切换要渲染的模型。
LODGroup型结构体.fadeMode 对应Inspector窗口的Fade Mode LODFadeMode型。控制各个LOD级别之间进行切换的时候,使用怎么样的动画进行过渡。 LODFadeMode.None表示不使用任何过渡动画,切换LOD级别的时候,会瞬间切换。 LODFadeMode.CrossFade表示切换LOD级别的时候,原来的模型仍然会存在一定秒数,之后才会消失。这样可能会同时看到两个LOD级别的模型,造成不好的视觉效果。 LODFadeMode.SpeedTree表示切换LOD级别的时候,使用SpeedTree样式的过渡动画。
LODGroup型结构体.localReferencePoint Vector3型。用于计算LOD级别与摄像机之间的距离的本地空间的参考点。 Unity会自动计算这个参考点与摄像机之间的距离,并根据该距离切换到对应的LOD级别,从而渲染对应的模型。
LODGroup型结构体.lodCount int型。这个LODGroup组件的LOD级别的数量。Culled是不算在内的。 例如默认情况下,有LOD 0、LOD 1、LOD 2、Culled,则这个变量的值是3,因为Culled是不算在内的。
LODGroup型对象.size 对应Inspector窗口的Object Size的值。 float型。表示本地空间中这个LOD组件的包围区域的大小。 在使用LODGroup组件进行LOD级别的切换时,Unity将自动根据摄像机到包围区域表面的距离来判断要切换到哪个LOD级别,而 size属性是计算此距离的重要因素之一。
LODGroup型结构体.ForceLOD(int 要切换到的LOD级别的索引) 强制渲染指定LOD级别对应的模型。 例如要渲染LOD 0对应的模型,则传入的参数就是0。如果要渲染LOD 1对应的模型,则传入的参数就是1 如果传入的参数大于这个LODGroup组件.lodCount-1,则不会渲染任何一个模型。 调用这个方法且传入0或正整数作为参数后,则这个LODGroup组件就不会根据摄像机的距离自动切换到对应的LOD级别了,会一直渲染这个方法指定的LOD级别对应的模型。 此时如果要让这个LODGroup组件重新根据摄像机的距离自动切换到对应的LOD级别,并自动渲染该LOD级别对应的模型,则可以再次调用这个方法,传入一个负整数作为参数,例如LODGroup型对象.ForceLOD(-1)
LODGroup型结构体.GetLODs() 返回LOD[]型。表示这个LODGroup组件的LOD级别的数组。 LOD级别的数组有哪些元素,可以在Inspecotor窗口的Object Size下方查看。
LODGroup型结构体.RecalculateBounds() 对应Inspector窗口的Recalculate Bounds按钮。 调用之后,会重置这个LODGroup组件的包围区域。 这个方法的调用相对较慢,不要经常调用。
LODGroup型结构体.SetLODs(LOD[]型 LOD级别的数组) 重新设置这个LODGroup组件的LOD级别的数组。 一旦调用这个方法,则这个LODGroup组件原来的LOD数组就会被整个替换掉。 LOD级别的数组有哪些元素,可以在Inspecotor窗口的Object Size下方查看。
LOD lod=new LOD(); 创建一个LOD级别,它是一个结构体。
LOD lod=new LOD(float 用于过渡的屏幕相对高度,Renderer[] 此LOD级别要使用的渲染器的数组) 创建一个LOD级别,它是一个结构体。并且设置用于过渡的屏幕相对高度和渲染器的数组。 用于过渡的屏幕相对高度的范围是[0,1]
LOD型结构体.fadeTransitionWidth float型。表示切换LOD界别时淡入淡出的过渡区域的宽度。 这个宽度与当前LOD的整个长度成比例,范围是[0,1] 仅当未动画化时才使用。
LOD型结构体.renderers Renderer[]型。表示这个LOD级别的渲染器的数组。
LOD型结构体.screenRelativeTransitionHeight float型。表示这个LOD级别用于过渡的屏幕相对高度,范围是[0,1]