From eb4e5ea83f00b04ce9a0406ca9545c4e7e3a24a2 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Tue, 28 Jul 2026 23:25:43 +0300 Subject: [PATCH] =?UTF-8?q?perf(frontend):=20=D0=B2=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8C=20adaptiveStream=20=D0=B8=20dynacast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оба флага в LiveKit по умолчанию выключены: каждый клиент был подписан на полное качество всех чужих треков независимо от размера плитки, а каждый паблишер слал все слои симулкаста, даже если их никто не смотрит. На тесте 28.07 (19 участников, ~8 камер) это дало устойчивые 140–169 Мбит/с исходящего трафика при пике 240, 662 события `remote bwe: channel congestion detected` и 146 переходов аллокатора STABLE → DEFICIENT — то есть видимый участникам лаг. Замер на локальном стенде (9 участников, паблишеры 720p, одинаковый состав комнаты, приращение bytesReceived по getStats клиента): без флагов 5 потоков 1280x720 @33 fps — 11 110 кбит/с с флагами 4 потока 320x150 @17 fps — 778 кбит/с Заодно начинает экономить уже написанный код, который до сих пор не давал выигрыша: «скрыть остальных» не рендерит карусель (TX контейнера LiveKit 0.76 → 0.03 Мбит/с), пагинация StageGrid рендерит только текущую страницу, а pauseVideoInBackground (дефолт true) работает лишь при adaptiveStream. Демонстрация экрана, режимы показа и листание страниц проверены — регрессий нет. --- frontend/src/pages/RoomPage.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/src/pages/RoomPage.tsx b/frontend/src/pages/RoomPage.tsx index aa703a8..47e0e71 100644 --- a/frontend/src/pages/RoomPage.tsx +++ b/frontend/src/pages/RoomPage.tsx @@ -187,6 +187,22 @@ export function RoomPage() { const { userChoices } = usePersistentUserChoices() const roomOptions = useMemo( () => ({ + // Оба флага в LiveKit по умолчанию выключены, и без них каждый клиент + // подписан на полное качество всех чужих треков независимо от размера + // плитки, а каждый паблишер шлёт все слои симулкаста, даже если их никто + // не смотрит. На тесте 28.07.2026 (19 участников, ~8 камер) это дало + // устойчивые 140–169 Мбит/с исходящего трафика при пике 240, 662 события + // `remote bwe: channel congestion detected` и 146 переходов аллокатора + // STABLE → DEFICIENT — то есть видимый участникам лаг. + // + // adaptiveStream: подписка на слой по фактическому размеру плитки на + // экране + пауза треков, которые сейчас не отрисованы. Именно на нём + // начинает экономить уже написанный код: «скрыть остальных» + // (RoomStage) не рендерит карусель, а пагинация StageGrid рендерит + // только текущую страницу — неприаттаченные треки считаются невидимыми. + // dynacast: паблишер прекращает отдавать слои, на которые нет подписчиков. + adaptiveStream: true, + dynacast: true, audioCaptureDefaults: { deviceId: userChoices.audioDeviceId || undefined }, videoCaptureDefaults: { deviceId: userChoices.videoDeviceId || undefined }, // Аудиовыход (колонки/наушники/bluetooth) — отдельный персист, не через