Silence a free video as soon as its sprite is destroyed #420

Closed
opened 2026-10-13 10:16:56 +02:00 by meleki · 1 comment
Owner

Ein Video-Sprite mit Video clock free ist nach dem Zerstören noch 2–4 s zu hören, wenn es Ton hat.

Ursache

Dasselbe Muster wie bei den Composition-Videos vor 65d7bf6:

  • Ein freier Player in der VideoLibrary (src/viewport/VideoLibrary.ts) läuft von selbst weiter. Er merkt nicht, dass sein Sprite weg ist.
  • Er wird erst verworfen, wenn ihn 2–4 s lang keiner mehr benutzt hat. Bis dahin spielt er samt Ton weiter.
  • In einer Pause wird gar nicht verworfen.

65d7bf6 hat das nur für gesteuerte Player behoben: Fragt 100 ms lang keiner nach ihnen, werden sie angehalten und stumm geschaltet. Freie Player sind davon ausgenommen.

Wann es auftritt

  • Ein Behavior zerstört ein Sprite, dessen Video frei läuft und Ton hat (Destroy, Szenenwechsel, Ende einer Partie).
  • Compositions sind nicht betroffen, sie steuern ihre Videos immer.

Vorschlag

  • Ein freier Player wird angehalten und stumm geschaltet, sobald kein Sprite ihn mehr zeigt. Verworfen wird er wie bisher später.
  • Teilen sich mehrere Sprites einen Player, darf erst das letzte ihn verstummen lassen.
  • Test: Unit-Test in video-library und ein Browser-Check, der den Ton nach Destroy misst (wie 68g).

Aufgefallen bei den Composition-Fixes in 65d7bf6.

Ein Video-Sprite mit **Video clock `free`** ist nach dem Zerstören noch **2–4 s zu hören**, wenn es Ton hat. ## Ursache Dasselbe Muster wie bei den Composition-Videos vor `65d7bf6`: - Ein freier Player in der `VideoLibrary` (`src/viewport/VideoLibrary.ts`) läuft von selbst weiter. Er merkt nicht, dass sein Sprite weg ist. - Er wird erst verworfen, wenn ihn 2–4 s lang keiner mehr benutzt hat. Bis dahin spielt er samt Ton weiter. - In einer Pause wird gar nicht verworfen. `65d7bf6` hat das nur für **gesteuerte** Player behoben: Fragt 100 ms lang keiner nach ihnen, werden sie angehalten und stumm geschaltet. Freie Player sind davon ausgenommen. ## Wann es auftritt - Ein Behavior zerstört ein Sprite, dessen Video frei läuft und Ton hat (`Destroy`, Szenenwechsel, Ende einer Partie). - Compositions sind nicht betroffen, sie steuern ihre Videos immer. ## Vorschlag - Ein freier Player wird angehalten und stumm geschaltet, sobald kein Sprite ihn mehr zeigt. Verworfen wird er wie bisher später. - Teilen sich mehrere Sprites einen Player, darf erst das letzte ihn verstummen lassen. - Test: Unit-Test in `video-library` und ein Browser-Check, der den Ton nach `Destroy` misst (wie 68g). Aufgefallen bei den Composition-Fixes in `65d7bf6`.
admin added this to the Development project 2026-10-13 13:47:38 +02:00
admin moved this to Next in Development on 2026-10-13 13:47:47 +02:00
Author
Owner

Erledigt mit 875c760 (Wiki 26df94f).

Umbau

  • Die VideoLibrary hält einen freien Player jetzt genauso an wie einen gesteuerten: Fragt 100 ms lang kein Sprite nach ihm (HUSH_MS), wird er angehalten und stumm geschaltet. Verworfen wird er wie bisher erst nach 2–4 s.
  • Das deckt Destroy, Szenenwechsel, Ende der Partie und ein ausgeschaltetes Sprite ab.
  • Wird der Player vorher wieder angefragt, spielt er an derselben Stelle weiter, hörbar nur in einer laufenden Partie.
  • Teilen sich mehrere Sprites einen Player, verstummt er erst, wenn keines mehr danach fragt.
  • Bei verdecktem Browser-Tab bleibt alles wie bisher.

Abweichung vom Vorschlag

Ein Sprite, das nur außerhalb des Bildes liegt, spielt sein freies Video weiter, im Spiel auch hörbar. Ob man ein Video hört, soll nicht vom Kameraausschnitt abhängen. Vorher lief so ein Video 2–4 s und wurde dann verworfen. Jetzt läuft es durch, und sein Player öffnet sich auch, wenn es nie im Bild war. Das kostet etwas Dekodierarbeit. Anlass: Der erste Wurf hat zwei bestehende Checks in 66g rot gemacht, weil deren Sprite außerhalb der Spielkamera liegt.

Tests

  • Unit video-library: 1 neu. Ein freier Player verliert seinen Träger, 200 ms später ist er angehalten und stumm. Er bleibt es über einen neuen Spielstart, spielt bei erneuter Anfrage ohne neues <video> hörbar weiter und läuft bei verdecktem Tab weiter.
  • e2e 66 auf melektaus-atx: ALL PASSED, 36 Checks, 66g-ii neu. Vor Destroy 31 Frames hörbar, danach in jedem gemessenen Frame paused und muted.
  • Gegenprobe ohne das Verstummen freier Player: Der Unit-Test und nur 66g-ii werden rot, der Player läuft hörbar weiter (paused: false, muted: false).
  • Gate auf melektaus-atx: 309 Dateien, 4797 Tests.

Nicht geprüft

  • Szenenwechsel und Ende der Partie sind nur hergeleitet, im Browser getestet ist nur Destroy.
  • Das Video außerhalb des Bildes ist nur über das bestehende 66g geprüft.
  • CI lief nicht, der Lauf ist gerade abgeschaltet.
Erledigt mit `875c760` (Wiki `26df94f`). ## Umbau - Die `VideoLibrary` hält einen **freien** Player jetzt genauso an wie einen gesteuerten: Fragt 100 ms lang kein Sprite nach ihm (`HUSH_MS`), wird er angehalten und stumm geschaltet. Verworfen wird er wie bisher erst nach 2–4 s. - Das deckt `Destroy`, Szenenwechsel, Ende der Partie und ein ausgeschaltetes Sprite ab. - Wird der Player vorher wieder angefragt, spielt er an derselben Stelle weiter, hörbar nur in einer laufenden Partie. - Teilen sich mehrere Sprites einen Player, verstummt er erst, wenn keines mehr danach fragt. - Bei verdecktem Browser-Tab bleibt alles wie bisher. ## Abweichung vom Vorschlag Ein Sprite, das nur **außerhalb des Bildes** liegt, spielt sein freies Video weiter, im Spiel auch hörbar. Ob man ein Video hört, soll nicht vom Kameraausschnitt abhängen. Vorher lief so ein Video 2–4 s und wurde dann verworfen. Jetzt läuft es durch, und sein Player öffnet sich auch, wenn es nie im Bild war. Das kostet etwas Dekodierarbeit. Anlass: Der erste Wurf hat zwei bestehende Checks in 66g rot gemacht, weil deren Sprite außerhalb der Spielkamera liegt. ## Tests - Unit `video-library`: 1 neu. Ein freier Player verliert seinen Träger, 200 ms später ist er angehalten und stumm. Er bleibt es über einen neuen Spielstart, spielt bei erneuter Anfrage ohne neues `<video>` hörbar weiter und läuft bei verdecktem Tab weiter. - e2e 66 auf `melektaus-atx`: ALL PASSED, 36 Checks, **66g-ii** neu. Vor `Destroy` 31 Frames hörbar, danach in jedem gemessenen Frame `paused` und `muted`. - Gegenprobe ohne das Verstummen freier Player: Der Unit-Test und nur 66g-ii werden rot, der Player läuft hörbar weiter (`paused: false, muted: false`). - Gate auf `melektaus-atx`: 309 Dateien, 4797 Tests. ## Nicht geprüft - Szenenwechsel und Ende der Partie sind nur hergeleitet, im Browser getestet ist nur `Destroy`. - Das Video außerhalb des Bildes ist nur über das bestehende 66g geprüft. - CI lief nicht, der Lauf ist gerade abgeschaltet.
admin moved this to Done in Development on 2026-10-14 10:37:55 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#420