Remote Control API Viewport Update Issue in Headless Editor Mode

Remote Control API property changes are not reflected in the Pixel Streaming viewport when running Unreal Editor in headless mode with -RenderOffscreen. Changes only become visible when the camera is moved, or viewport is manually refreshed.

Environment Details

  • Platform: AWS EC2 Windows Server
  • Unreal Engine Version: 5.5
  • Deployment: Headless Editor with Pixel Streaming
  • Use Case: Remote control of editor properties via HTTP API for live streaming & Rendering

Current Setup

Running Unreal Editor on AWS EC2 Windows Server with Pixel Streaming. Testing both:

Headless Mode:

UnrealEditor-Cmd.exe  "Path\To\Project.uproject" -RenderOffscreen -EditorPixelStreamingStartOnLaunch=true -EditorPixelStreamingRes=1920x1080 -PixelStreamingURL=ws://127.0.0.1:8888

GUI Mode:

UnrealEditor.exe "Path\To\Project.uproject" -EditorPixelStreamingStartOnLaunch=true -EditorPixelStreamingRes=1920x1080 -PixelStreamingURL=ws://127.0.0.1:8888

Issue Behavior

  1. Remote Control API calls execute successfully - HTTP responses return 200 OK
  2. Properties actually change - Verified through subsequent GET requests
  3. Viewport does not update - Changes are not visible in Pixel Streaming output
  4. Issue occurs in BOTH headless AND GUI modes on AWS EC2
  5. Works perfectly on local development machine with identical setup
  6. Workaround that works: Moving the camera or any viewport interaction immediately shows all pending changes

Environment Comparison

  • AWS EC2 (Issue Present): Both headless and GUI editor modes exhibit the problem
  • Local Machine (Works Fine): Same project, same commands, immediate viewport updates
  • Network/API: All Remote Control API functionality works identically in both environments

Configuration Attempts

We have verified and set the following editor performance settings to disable CPU throttling and realtime viewport restrictions:

File: Config/DefaultEditorSettings.ini

[/Script/UnrealEd.EditorPerformanceSettings]
bThrottleCPUWhenNotForeground=False
bDisableRealtimeViewportsInRemoteSessions=False
bShowFrameRateAndMemory=False
r.VSyncEditor=False

Expected Behavior

Remote Control API property changes should be immediately visible in the Pixel Streaming viewport without requiring manual viewport interaction or camera movement.

Any guidance on the proper approach for this use case would be greatly appreciated.

Hi Mohammed,

At first glance I’m not sure why it would behave differently on your server if you’re running the same command. The behavior you’re describing reminds me of the issues we have when running in -game or in a packaged project.

What http API calls are you using in remote control? I would try adding the parameter that enables generating transactions, that’s one of the usual culprits.

If you’re using the /object/property route try access WRITE_TRANSACTION_ACCESS, if you’re using the /object/call, then try setting generateTransaction to true in your payload.

I would also check if there’s anything in the logs that might give us a clue.

Let me know how it goes,

Jérémie

Hi [Content removed]

Something else that you could try in order to find the root cause, is to create a BP function that makes a change then invokes CurrentWorld->UpdateWorldComponents, testing with bRerunConstructionScripts = false and = true.

That should give us a better idea on whether the remote control plugin is missing something.

Just to confirm, are you able to reproduce this issue when looking at the server’s UE viewport directly, without PixelStreaming? I’d like to determine whether this might be related to a specific interaction with PixelStreaming or not.

The issue is resolved now, though I don’t know the exact root cause.

Previously, I was seeing the same behavior even in the Unreal Editor viewport (not just Pixel Streaming) when triggering Remote Control API calls. When I tried launching Unreal Editor for testing directly in the viewport again, it showed the error:

“This specific software version is not supported.”

To troubleshoot, I:

  • Enabled the “Use hardware graphics adapters for all Remote Desktop Services sessions” setting in OS Group Policy.
  • Deleted Unreal and related AppData.
  • Did a fresh reinstall.

After these steps, the issue no longer occurs, and everything is now working normally.

Hey Mohammed, glad you could get it into a working state.

I wonder if something was somehow overriding the realtime viewport rendering, I know by default RDP will override it, but you had the option disabled so not sure what’s happening there.

If you can get it into the same state, I would validate that realtime viewport is not overridden by something else.

Let me know if you’re able to reproduce this problem again.

Hi Jérémie,

Thank you for the suggestion. I tested with generateTransaction: true as recommended.

Test Request

curl 'http://localhost:30010/remote/object/call' \
  -X 'PUT' \
  -H 'content-type: application/json' \
  --data-raw '{
    "objectPath":"/Game/Editor/CrossTrek_Exterior_P2.CrossTrek_Exterior_P2:PersistentLevel.BP_MaterialConfig_C_1",
    "functionName":"Update Car Material",
    "parameters":{"MaterialToSet":"KBY"},
    "generateTransaction":true
  }'

Result

  • API executes successfully.
  • Log confirms function executes as expected:

[2025.08.18-11.02.50:930][647]LogBlueprintUserMessages: [BP_MaterialConfig_C_1] New Color: KBY - 1* However, the viewport does not update until I either:
+ Interact with the Pixel Streaming viewport (e.g., click/drag camera), or
+ Switch the active camera.

Additional Context

  • On AWS EC2 we use an offline installer due to network restrictions (local machine uses the regular installer).
  • Logs show repeated EOS SDK timeouts when trying to reach Epic’s backend, e.g.:
[2025.08.18-11.03.03:275][618]LogEOSSDK: Warning: LogHttp: 00000736A6743000: HTTP request timed out after 30.00 seconds URL=https://api.epicgames.dev/sdk/v1/default?platformId=WIN
[2025.08.18-11.03.03:284][619]LogEOSSDK: Warning: LogEOS: Failed to connect to the backend. ServiceName=[SDKConfig], OperationName=[GetPlatformConfigRoute]
[2025.08.18-11.03.20:888][508]LogEOSSDK: Warning: LogHttp: Retry exhausted on https://api.epicgames.dev/telemetry/data/datarouter/api/v1/public/data?SessionID=...
  • These appear unrelated to Remote Control API functionality, since the same API calls work fine locally.
  • Locally, property changes appear instantly in the Pixel Streaming viewport without requiring any manual interaction.

Do you have any additional troubleshooting steps or logging flags I could try to help narrow down why the viewport refresh behaves differently between local and cloud environments?

Hello Jérémie

I implemented theUpdateWorldComponents function as suggested and tested with both bRerunConstructionScripts = true/false. The function executes successfully, and logs confirm proper world context access, but the Pixel Streaming viewport still doesn’t update on AWS EC2. This suggests the Remote-Control plugin isn’t missing the UpdateWorldComponents call there’s likely something environment-specific on AWS preventing the viewport refresh mechanism from working properly.

Implementation:

void ATestRemoteControlUpdateClass::ForceUpdateWorldComponents(bool bRerunConstructionScripts)
{
    // ... logging and validation
    World->UpdateWorldComponents(bRerunConstructionScripts, false);
}

Logs

[2025.08.20-17.59.48:347][330]LogTemp: Warning: === ForceUpdateWorldComponents Called ===
[2025.08.20-17.59.48:349][330]LogTemp: Warning: World found: CrossTrek_Exterior_P2
[2025.08.20-17.59.48:388][330]LogTemp: Warning: UpdateWorldComponents completed successfully!