From 1b55e88cd52462a863bf932a399e3f00ef114cff Mon Sep 17 00:00:00 2001 From: kilyabin <65072190+kilyabin@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:46:56 +0400 Subject: [PATCH] fix(fullscreen-player): stop mesh blob and portrait animations in no-compositing mode (#175) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In software compositing (WEBKIT_DISABLE_COMPOSITING_MODE=1), WebKit renders entirely on the CPU. The mesh blob animations were not covered by the no-compositing overrides: blob-a occupies 130×130% of the viewport, so each frame the CPU had to composite a surface larger than the screen. On high-DPI displays (e.g. 8K) this drops the fullscreen player to ~10 FPS. - Stop mesh blob pan animations (static gradients are preserved) - Stop portrait drift animation (filter was already removed) - Remove box-shadow from the seekbar played bar (its width changes on every playback tick; in software mode each change triggers a box-shadow repaint) --- src/styles/components.css | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/styles/components.css b/src/styles/components.css index 35952446..63de6451 100644 --- a/src/styles/components.css +++ b/src/styles/components.css @@ -3526,10 +3526,11 @@ html.no-compositing .fs-close { background: rgba(0, 0, 0, 0.45); } -/* Portrait: remove CSS filter (drop-shadow) and will-change */ +/* Portrait: remove CSS filter (drop-shadow), will-change and drift animation */ html.no-compositing .fs-portrait { filter: none; will-change: auto; + animation: none; } /* Portrait wrap: replace mask-image fade with a pseudo-element overlay gradient. @@ -3563,6 +3564,20 @@ html.no-compositing .fs-lyrics-rail { will-change: auto; } +/* Mesh blobs: stop animations — in software mode each frame composites surfaces + larger than the screen (blob-a is 130 × 130 % of the viewport); on high-DPI + displays this saturates the CPU and drops the player to ~10 FPS. + Static gradients are preserved; only the slow pan animation is removed. */ +html.no-compositing .fs-mesh-blob { + animation: none; +} + +/* Seekbar played bar: remove box-shadow — its width changes on every playback + tick; in software rendering each change triggers a box-shadow repaint. */ +html.no-compositing .fs-seekbar-played { + box-shadow: none; +} + /* Chat */ .chat-popup { position: absolute;