obsidian/笔记文件/2.笔记/Unity性能优化_第五章.md
2025-03-26 00:02:56 +08:00

7.4 KiB
Raw Permalink Blame History

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级别1LOD级别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]