Hi,
Following the ongoing tests I’m currently performing, I’m encountering what appears to be a fundamental limitation — but I want to make sure I’m not doing something wrong before reporting it as a bug.
What I’m trying to do
I’m calling SimConnect_CameraSet with the WORLD referential and the ALL_ROTATION mask (POSITION | ROTATION | FOV | REFERENTIAL) to move the camera to a specific lat/lon/alt position at regular intervals. A single call works perfectly. The issue appears when I send updates at a high rate.
I am not using a target.
Observed behavior
Below approximately 500 ms between calls, updates become unreliable. Below approximately 250 ms, they stop being applied entirely — the camera freezes. This happens regardless of whether I use a DispatcherTimer, a dedicated background thread, or direct P/Invoke calls with no UI involvement at all. The issue is not on the client side.
My question
Is there an intentional rate limit on SimConnect_CameraSet when using the WORLD referential? Is the command processed once per sim frame, meaning the effective maximum update rate is limited by the simulator’s framerate (~16 ms at 60 fps)? And if so, what happens when the client sends commands faster than that — are they queued, dropped, or does it cause the connection to stall?
I also tried using the Frame system event to synchronize my calls with the simulator, but the behavior was the same.
Why this matters — multiplayer aircraft tracking
If WORLD referential updates are indeed throttled or capped, this has a critical implication: it becomes impossible to smoothly track a multiplayer aircraft with an external camera.
The AIRCRAFT referential works perfectly for the user’s own aircraft, but it cannot be used for a multiplayer or AI aircraft. WORLD is the only option in that case. If WORLD cannot sustain updates at 25 fps or higher, real-time external camera tracking of any object other than the user aircraft is simply not achievable with the current API — regardless of how the client is implemented.
Is this a known limitation? Is there a recommended approach for this use case that I might be missing, or is this something that could be addressed in a future update?
I’m posting this as a follow-up, but I can open a new topic if needed.
Thanks.