The current TrackedPoseDriver sets the local position and rotation in 1 external call each, with both having to recalculate all children etc. This can definitely add overhead over time when adding animation to the hands etc.
Recent unity versions have SetLocalPositionAndRotation. Using this in SetLocalTransform will be beneficial for performance. No changes are made in behavior, with TrackingType.RotationAndPosition performance improved (1 less branch and combined call), and rotation/position only modes just have 1 extra branch when used.
Starts at line 584 for those who want to use the improved version.
Old code:
protected virtual void SetLocalTransform(Vector3 newPosition, Quaternion newRotation)
{
var positionValid = m_IgnoreTrackingState || (m_CurrentTrackingState & TrackingStates.Position) != 0;
var rotationValid = m_IgnoreTrackingState || (m_CurrentTrackingState & TrackingStates.Rotation) != 0;
if (rotationValid &&
(m_TrackingType == TrackingType.RotationAndPosition ||
m_TrackingType == TrackingType.RotationOnly))
{
transform.localRotation = newRotation;
}
if (positionValid &&
(m_TrackingType == TrackingType.RotationAndPosition ||
m_TrackingType == TrackingType.PositionOnly))
{
transform.localPosition = newPosition;
}
}
New improved code:
protected virtual void SetLocalTransform(Vector3 newPosition, Quaternion newRotation)
{
var positionValid = m_IgnoreTrackingState || (m_CurrentTrackingState & TrackingStates.Position) != 0;
var rotationValid = m_IgnoreTrackingState || (m_CurrentTrackingState & TrackingStates.Rotation) != 0;
if(m_TrackingType == TrackingType.RotationAndPosition && rotationValid && positionValid)
{
transform.SetLocalPositionAndRotation(newPosition, newRotation);
}
else
{
if (rotationValid &&
m_TrackingType == TrackingType.RotationOnly)
{
transform.localRotation = newRotation;
}
if (positionValid &&
m_TrackingType == TrackingType.PositionOnly)
{
transform.localPosition = newPosition;
}
}
}