Periodic frame drop (~1 frame every ~2 s) on Android client at 2560x1600 despite clean host/network stats

オープン
#5,956 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
cpp

調査の方向性

Start by examining the attached Sunshine log and the frame pacing, encoding, and packet pacing paths; the report does not identify a specific source file or test. Compare the client’s incoming and rendering rates with the host’s frame timing to locate where the roughly 0.49 FPS gap is introduced. Done means identifying a reproducible cause and confirming that rendering keeps pace without periodic hitches.

索引モデルが issue の本文から書いたものです。

説明

Is there an existing issue for this?
  • I have searched the existing issues
Is your issue described in the documentation?
  • I have read the documentation
Is your issue present in the latest beta/pre-release?

None

Describe the Bug

Streaming to a Samsung Galaxy Tab S9 FE+ (Moonlight Android, HEVC, 2560x1600) shows a short hitch/stutter every ~2 seconds. Once host-side problems were fixed (below), the Moonlight stats overlay is clean everywhere except one line: the client renders ~0.49 fewer frames per second than it receives.

Typical overlay (Moonlight 60 FPS / Balanced / 100 Mbps, game capped at 30 FPS with vsync):

Video stream: 2560x1600 30.00 FPS
Decoder: c2.exynos.hevc.decoder
Incoming frame rate from network: 30.00 FPS
Rendering frame rate: 29.51 FPS
Frames dropped by your network connection: 0.00%
Average network latency: 2 ms (variance: 0 ms)
Host processing latency min/max/average: 5.1/7.6/6.1 ms
Average decoding time: 11.08 ms

The "incoming minus rendering" gap is ~0.49 FPS in every configuration I tried:

Config Incoming Rendering Gap
Stream 60 FPS, Balanced, game ~24-29 FPS 29.36 / 23.90 28.87 / 23.41 0.49 / 0.49
Stream 30 FPS, Smoothest video, 30 Hz host display 30.02 29.54 0.48
Stream 60 FPS, Balanced, 60 Hz host display 30.00 29.51 0.49

That's about one dropped frame every ~2 s, which matches how often the hitch is visible. The gap stays the same at different content frame rates (24 vs 30 FPS), so it looks like a fixed-period event rather than a clock-rate mismatch.

Things that did NOT fix it:

  • Tablet Motion smoothness Adaptive (90 Hz) vs Standard (60 Hz)
  • Frame pacing: Balanced, Smoothest video, Lowest latency
  • Stream 30 vs 60 FPS; host virtual display 30 vs 60 Hz
  • Apollo 0.4.6 + Artemis 20.2.6 instead of Sunshine + Moonlight (same symptom)
  • 50 Hz ping from host to tablet while idle: median 2 ms, no periodic spikes

Host-side problems I found and fixed along the way (in case they're relevant):

  • With HAGS on, realtime NVENC priority + VRAM ~90% gave NvEnc: frame N encode wait timeout freezes (matches #1031). Setting nvenc_realtime_hags = disabled stopped those, but then the stream fell to ~20 FPS with 75-100 ms host latency whenever the game pinned the GPU at 100%. Turning HAGS off in Windows (Sunshine back to realtime priority) fixed it: 30 FPS, ~6 ms host latency.
  • The host Ethernet links at only 100 Mbps, so a 100 Mbps bitrate at a 30 FPS stream saturated it. Now kept at ~55 Mbps on the wire (60 FPS stream, 30 FPS content).

Main question: is this ~2 s periodic client-side drop a known issue with Exynos decoders / Samsung tablets, or is there a host-side setting (frame pacing, minimum_fps_target, packet pacing) that would avoid it? If it belongs in moonlight-android instead, please say so and I'll move it.

Expected Behavior

Rendering frame rate equals incoming frame rate (30.00 / 30.00), with no periodic hitches, given 0% network loss and stable host latency.

Additional Context
  • Client: Samsung Galaxy Tab S9 FE+ (Exynos 1380, 12.4" 2560x1600 90 Hz LCD), Moonlight Android (latest from Play Store), 5 GHz Wi-Fi (channel 149), decoder c2.exynos.hevc.decoder
  • Host is a hybrid laptop: internal panel on Intel iGPU, HDMI and the virtual display on NVIDIA
  • Virtual display: MikeTheTech Virtual Display Driver 25.7.23, pinned to the RTX 4050, 2560x1600 @ 30/60/90/120 Hz
  • Game: Crimson Desert, capped at 30 FPS (NVIDIA app Max Frame Rate) with vsync on; GPU ~85%
  • Controller: DualSense over Bluetooth on the host
Host Operating System

Windows

Operating System Version

Windows 11 Home 10.0.26200

Architecture

amd64/x86_64

Sunshine commit or version

2026.914.233613 (commit 63d35f702ee9e362e43263742981836ec0710384)

Package

Windows - installer (recommended)

GPU Type

NVIDIA

GPU Model

NVIDIA GeForce RTX 4050 Laptop GPU (6 GB) + Intel UHD Graphics (i5-13420H), HP Victus 15-fa1xxx

GPU Driver/Mesa Version

32.0.16.1742 (617.42)

Capture Method

Desktop Duplication API (default)

Config
adapter_name = NVIDIA GeForce RTX 4050 Laptop GPU
output_name = {9acddf6d-43cc-576e-9aff-0c5fc80b4cc8}
dd_configuration_option = ensure_only_display
dd_resolution_option = auto
dd_refresh_rate_option = auto
dd_hdr_option = auto
encoder = nvenc
nvenc_preset = 1
nvenc_twopass = quarter_res
nvenc_realtime_hags = disabled

(HAGS is now off in Windows, so Sunshine logs "Using realtime GPU priority".)

Apps

Desktop; Crimson Desert via steam://rungameid/3321460 (detached)

Relevant log output
[2026-10-19 00:25:20.520]: Info: Active GPU has HAGS disabled
[2026-10-19 00:25:20.520]: Info: Using realtime GPU priority
[2026-10-19 00:28:34.674]: Info: Display refresh rate [60Hz]
[2026-10-19 00:28:34.674]: Info: Requested frame rate [60/1 exactly 60 fps]
[2026-10-19 00:28:55.450]: Error: NvEnc: frame 1113 encode wait timeout   <- only during game load
[2026-10-19 00:30:27.213]: Error: NvEnc: frame 4012 encode wait timeout   <- none after this; stutter continued
[2026-10-19 00:35:30.579]: Info: CLIENT DISCONNECTED

Full log attached: sunshine.log

sunshine.log

Expected Behavior

No response

Additional Context

No response

Host Operating System

Windows

Operating System Version

Windows 11 OS Build 26200.9711

Architecture

amd64/x86_64

Package

Windows - exe installer

GPU Type

NVIDIA

GPU Model

RTX 4050 MOBILE GPU

GPU Driver/Mesa Version

32.0.16.1742 (617.42)

Capture Method

Desktop Duplication API (Windows)

Apps

Log output
please see the attached log file for the full logs
Online logs

No response

主要言語
C++
スター
43k
フォーク
2.4k
平均マージ
1日 15時間
マージ済み PR(30日)
105

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

LizardByte/Sunshine のほかの issue

LizardByte/Sunshine の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。