性能调试:动态光照环境
点击这里返回到性能调试页面。
动态光照环境
问题:
动态光照环境更新的性能消耗显示为非常昂贵。
解决方案:
默认情况下所有的 InterpActors (也就是 Movers)和 KActors 都有动态光照环境。当一个动态关照环境更新时,它将会对光源进行线性检测,这样会增加许多CPU消耗。然而,您可以通过进行各种各样的设置来降低动态物体的光照消耗。
这里是一些光照环境设置,按照从最昂贵到最便宜的(在游戏线程上)顺序,也介绍了何时使用相应的设置:
1) bEnabled=True, bDynamic=True (默认)
这些设置仅在需要的时候使用,它们将会基于 InvisibleUpdateTime 和 MinTimeBetweenFullUpdates 进行更新。 同一时刻不应该有多余50个这样的项处于活动状态。 当它们可见、靠近玩家或者当它们移动时需要进行额外的可见性检测。
2) bEnabled=True, bDynamic=False, bForceNonCompositeDynamicLights=True
这些设置应该是非常廉价的,环境在第一次更新时进行更新,以后再也不会更新。 bForceNonCompositeDynamicLights 可以允许动态光源影响它们,这将没有任何严重的游戏线程性能消耗。 可以有成百个这样的设置,它们唯一的消耗(在第一次更新后)是到动态光源的线性检测(并且仅当拥有者可见时)。 这些要比使用预计算阴影的光照看上去要好的多,因为它们可以旋转并且光照仍然可以保持正确。 它们通常用于破碎网格物体、GDO以及其他东西。 如果您发现这些产生了很多新能消耗,那么可以在代码侧进行一些优化。
3) bEnabled=False , bUsePrecomputedShadows=True (在图元组件上)。 同时,您必须把它从动态光照通道中取出,并把它放到静态光照通道中。
这些将会进行光照贴图,渲染的性能消耗很低,它们应该没有游戏线程的消耗(除了调用了 UDynamicLightEnvironmentComponent::Tick 函数)。 当移动它们时,它们的效果将会错误。
这是个控制台命令,可以用于查看有多少光照环境处于活动状态。在控制台上输入 SHOWLIGHTENVS ,您将会获得在那帧中更新的光照环境的所有列表。输入应该是这样的:
Log: LE:SP_MyMap_01_S.TheWorld:PersistentLevel.InterpActor_12.DynamicLightEnvironmentComponent_231 1 Log: LE:SP_MyMap_01_S.TheWorld:PersistentLevel.InterpActor_55.DynamicLightEnvironmentComponent_232 0 Log: LE:SP_MyMap_01_S.TheWorld:PersistentLevel.InterpActor_14.DynamicLightEnvironmentComponent_432 1 ...
在每行末尾的‘1’意味着 bDynamic 设置为 TRUE 。这可以用于引导关卡设计人员来修改它们的地图以便降低更新消耗。
反馈
您有关于引擎中性能和内存方面的问题或意见吗? 将您的问题发送到 right here(这里)!
点击这里返回到性能调试页面。