I'm seeing what may be the same issue on visionOS 27.0.1 (Apple Vision Pro), and I have
measurements that may help narrow it down.
Setup: SwiftUI app, RealityView in a full ImmersiveSpace. The world moves around the user
every frame, so any change in content latency shows as judder during turns.
Symptom: when the space is opened without a tap in the app's UI (system launch via
UIApplicationPreferredDefaultSceneSessionRole, or openImmersiveSpace from code, even after
a delay), RealityKit content judders while moving. When the space is opened by tapping a
button in a window, or after the user taps any SwiftUI control inside the space (e.g. a
ViewAttachmentComponent), motion becomes smooth and stays smooth for the rest of the session.
A pinch in empty air doesn't help.
What changes: frame rate, CPU and GPU load are the same in both states. Only the timing
of the app's UI update cycle changes. With a UIUpdateLink on the immersive UIWindowScene,
in .beforeCATransactionCommit:
estimatedPresentationTime - now: ~23.9 ms (judder) -> ~17.1 ms (smooth) at 100 Hz
completionDeadlineTime - now: ~13.9 ms -> ~7.1 ms
The switch happens exactly on the first tap delivered to the app's UI. In RealityKit Trace,
the app's entity commits land 3–6 ms after the render server's frame start before the tap
(close to its latch, so content latency alternates between frames) and 0–2 ms after it.
RealityKit's app-side update runs inside UIKit's update cycle (_UIUpdateSequenceRunNext ->
CA commit -> re::Engine::doUpdate), so the UI update scheduler seems to stay in a
"waiting for input" timing mode until the first digitizer event arrives.
Workarounds: open the space from a window button, or require a tap on an in-space SwiftUI
control at start
Topic:
Spatial Computing
SubTopic:
ARKit
Tags: