我的一个测试工程里有个测试场景是大批量的调整Component的碰撞属性,用了SetCollisionProfileName
和SetCollisionEnabled
来实现。
但是在测试的过程中发现了一个问题,这两个函数的调用会导致性能急剧下降。
SetCollisionProfileName
UPrimitiveComponent::SetCollisionProfileName
会带来约50us-100us
的卡顿,Component数量一多很容易到毫秒级别的耗时。
主要的耗时在FBodyInstance::UpdatePhysicsFilterData()
SetCollisionEnabled
这个函数更夸张,可能会导致100us-200us
的卡顿,可能会导致PhysicsState
重建(类似于SceneProxy的MarkRenderStateDirty)。
如果用的物理引擎是Chaos可以参考下面的文章进行hack一下,phsyx或者havok就只能自求多福了..
结论
不要在tick或者timer这种高频调用里大批量的改变Component的Collision属性。 如果想要换用不同的Profile来测试碰撞,KismetSystemLib和UWorld下有一些接口可以在不改变Component的属性的情况下直接用几何体进行测试。