The description of SpringArmComponent's "Use Camera Lag Substepping" option says "sub-step camera damping so that it handles fluctuating frame rates well". However, as noted and explained by a licensee on this UDN case (https://udn.unrealengine.com/s/case/500QP00000B76TmYAJ/bug-in-uspringarmcomponentupdatedesiredarmlocation-with-busecameralagsubstepping), it does not handle fluctuating frame rates correctly, which can cause noticeable judder.
In a correct implementation, using "Camera Lag Substepping" and setting "CameraLagMaxTimeStep" to "1/60" should make the camera behave as if the game was running at 60 fps, even if the actual frame rate is stable or fluctuating below that. However, in the current implementation (from UE 4.27 to UE 5.4), the calculated interpolation substep is not correct.
The licensee on the UDN case provided a solution that works well for the intended purpose on camera rotations, as analyzed mathematically and verified empirically by a UDN partner. A simplified-diff solution for both the rotation and location can be found in the repro project (please diff the provided MySpringArmComponent.h|.cpp with the built-in SpringArmComponent.h|.cpp on UE 4.27, the diff is nearly identical on later engine versions):
[Engine/Source/Runtime/Engine/Classes/GameFramework/SpringArmComponent.h]
[Engine/Source/Runtime/Engine/Private/GameFramework/SpringArmComponent.cpp]
.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-216449 in the post.