Skip to content

High latency with scrcpy (~35–70ms) in cloud Android setups #6642

@maddox05

Description

@maddox05

Hi! I’m building an Android cloud-gaming platform.

Repo:
https://github.com/maddox05/android-cloud-gaming

I’ve been experimenting with an Android stack built on ReDroid (Docker) combined with scrcpy server to extract frames and handle input forwarding.

GPU passthrough in ReDroid is still a separate issue that I’m debugging, but my main question is about scrcpy latency.


Observed behavior

Even with hardware encoding enabled, I consistently see an additional ~35–70ms of latency (given the docs) introduced by scrcpy itself (measured from input → frame update). This is on top of network RTT.

For cloud gaming, this becomes a bottleneck:

  • Platforms like GeForce NOW advertise ~20–30ms end-to-end RTT
  • With scrcpy, I’m already adding ~35ms before transport

Questions

  1. Is this latency inherent to scrcpy’s architecture?

    • Is it primarily due to how frames are captured (SurfaceFlinger / MediaProjection)?
    • Or due to buffering, threading, or synchronization in the server pipeline?
  2. Is scrcpy optimized for low-latency streaming, or more for reliability/debugging?
    My understanding is that scrcpy prioritizes stability and compatibility rather than absolute minimum latency?

  3. Are there known ways to reduce this latency further?
    For example:

    • Alternative capture paths (bypassing SurfaceFlinger?)
    • Different encoder / buffer settings
    • Reducing frame queue depth or synchronization points
  4. Would a custom “in-house” solution be required to go lower?
    If targeting sub-20ms:

    • Do most cloud-gaming platforms avoid SurfaceFlinger entirely? (now.gg cloudmoon)
    • Are they hooking closer to the GPU / HWComposer layer or using vendor-specific paths?

Context

I’m trying to understand whether:

  • scrcpy can realistically be pushed closer to cloud-gaming-grade latency, or
  • it’s fundamentally the wrong tool for this use case and better suited for debugging/mirroring

Any architectural insight or pointers would be hugely appreciated.

Thanks for the great work on scrcpy 🙏

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions