Dawn Stream cloud streaming

Dawn Engine Dawn Stream pushes the locally rendered viewport to a browser over WebRTC and injects remote browser input back into the engine. The full application runs on a GPU host; end users only need a browser for try-before-you-buy, review, or demos—no client install.

Maturity: MVP delivered (core pipeline works). Shipped as the DawnStream Gem; off by default. Enable and start streaming explicitly. The recommended demo tier is 720p / 30 fps. With a real WebRTC stack and hardware encode, 1080p is a viable production-oriented tier. Higher concurrency and full cloud orchestration continue on the roadmap.

It does not replace the Multiplayer Gem: Dawn Stream carries encoded video and remote input, not authoritative game-state replication.

What problem this solves

Cloud rendering, digital-twin kiosks, remote review, and web demos often require shipping a full client or hand-rolling capture, encode, playback, and input return. Dawn Stream provides an end-to-end path:

  • Dawn Engine renders on a GPU host;
  • the Gem captures the Atom viewport, encodes, and sends over WebRTC;
  • the browser plays low-latency video and returns input on a DataChannel;
  • a signaling service handles discovery, auth, and SDP/ICE exchange.

With the Gem disabled or streaming stopped, local input, rendering, and networking behave as before. You do not need to add level components for everyday streaming—the system component activates with the Gem.

How it works

Browser Viewer ──HTTPS/WSS signaling──► Signaling Server
 │ │
 ├── WebRTC media (video / optional audio) ► DawnStream Runtime (in-engine)
 └── DataChannel input / control ──────────► RemoteInputDevice → AzFramework
 Frame Capture ← Atom Viewport
 Encoder → WebRTC
  1. The Streamer (Dawn Engine app) connects to signaling and registers capabilities.
  2. The Viewer (browser) authenticates, joins, and completes SDP/ICE.
  3. The engine captures viewport frames → color convert / encode → WebRTC RTP.
  4. Browser input arrives on the DataChannel into RemoteInputDevice; gameplay treats it like a local device.
  5. A bitrate loop reacts to loss / REMB; keyframes are on-demand via PLI/FIR (recommended default).

Layout under Gems/DawnStream/:

ComponentRole
Code/Engine gem: config, signaling client, session, capture, WebRTC, remote input, diagnostics
Signaling/Reference signaling server (Node.js, zero runtime deps)
Frontend/Browser SDK + reference player player.html
SFU/Optional Selective Forwarding Unit (fan-out; not required for MVP)
Protocol/conformance/Cross-end golden protocol vectors
Tools/E2E, weak-network, and soak harnesses

Quick start (summary)

  1. Start signaling: cd Gems/DawnStream/Signalingnode src/main.ts --port 8090 → check /healthz.
  2. Enable the Gem; set DAWNSTREAM_AUTH_TOKEN / PS_* env vars; launch with --dawnstream-enabled --dawnstream-mode AlwaysStreaming.
  3. Build and open the reference player with ?signaling=.&token=..

Without libwebrtc / native CMake gates the engine uses a stub adapter (signaling and input work; no real video). Full steps and acceptance checks: Getting started.

Handbook chapters

ChapterContents
Getting startedPrerequisites, three-step loop, acceptance checklist, stub behavior
Building for real mediaRoute A/B CMake gates, encoder probe, zero-copy warnings
SignalingStandalone vs embedded, tokens, flags, health checks
Browser and inputplayer.html, URL params, Input Owner, filters
ConfigurationPrecedence, recommended tiers, setreg / CLI by block
Diagnosticsps_* commands, stats fields, CSV, troubleshooting
DeploymentTopologies, TURN, firewall, NVENC, security checklist
ReferenceCommand / key cheat sheets, API summary, limits

Glossary

TermMeaning
StreamerDawn Engine process that captures, encodes, and sends media
ViewerBrowser client that plays video and sends input
SignalingWebSocket service for auth, discovery, and SDP/ICE relay (not media)
Input OwnerThe viewer currently allowed to inject input
Stub adapterDefault WebRTC backend when media CMake gates are off—no real frames
Route Alibwebrtc wrapper with internal software encode
Route BNative libwebrtc + optional hardware encode (e.g. NVENC)
Embedded signalingIn-process signaling server (local / Editor demos)
SFUOptional Selective Forwarding Unit for one-to-many fan-out

You can rely on:

  • Optional gem; single-streamer / single-viewer end-to-end video and mouse/keyboard input when media gates are on;
  • setreg + CLI + diagnostic console commands; standalone or embedded signaling; STUN/TURN config entry points;
  • Route A software encode for demos; Route B hardware encode and GPU color convert when built correctly;
  • Bitrate feedback, on-demand keyframes, input ownership and disconnect release.

Do not assume:

  • Real video without CMake media gates (stub has no media);
  • Streaming on by default (needs Enabled plus mode / CLI);
  • Zero-copy is safe for long-lived reconnect loops (off by default for a reason);
  • Dawn Stream replaces multiplayer state sync or every need for a local client;
  • Multi-viewer arbitration, full cloud orchestration, SFU, HDR/XR, and similar are default deliverables (mostly extensions or experimental flags).

Next steps


Copyright © 2026 DawnEngine. All rights reserved.

DawnEngine is a commercial 3D engine distributed under the DawnEngine end-user license agreement. Engine binaries and source are proprietary and are not covered by the licenses below.

Documentation only: the prose and templates on this site are a derivative work of Open 3D Engine (O3DE) documentation by the O3DE Contributors, used under CC BY 4.0 (documentation content), Apache 2.0 (site code), and the MIT license (inline code samples).

The open-source 3D engine that DawnEngine is built on top of is Open 3D Engine . DawnEngine is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the O3DE project. “O3DE” and “Open 3D Engine” are trademarks of The Linux Foundation.