У меня сейчас в разработке проект полноэкранного виджета для OBS, для использования на своих стримах в будущем.
Это "монолит" почти на 9 тысяч кода (учитывая PHP вставки, HTML, CSS, и большая часть - JavaScript). По большому счёту занимается просто показом уведомлений (красочных, иногда с анимацией, иногда с QR кодом, если есть - проигрывание звука) через какой-то промежуток времени. При этом каждое уведомление представляет из себя "сессию" и работает в несколько фаз: красивая canvas 2d анимация (filling), показ и скрытие уведомления (баннера) (showing), завершающая красивая canvas 2d анимация (outro), фаза ожидания (idle).
При этом скрипт должен работать долго.
Как например тот-же DonationAlerts - работает, не виснет, и работает сколько нужно. При этом я слегка анализировала его работу - там куча вебсокетов, событий, подгрузка ресурсов, и прочее прочее прочее. Грубо говоря - сделано ещё сложнее.
Мой скрипт - виснет.
Стабильно виснет именно в OBS.
Через довольно длительный промежуток времени, например 8 часов, 11 часов, 14 часов, и даже 21.5 час (рекорд).
А может зависнуть и через 32 минуты, например. Или через 3 часа.
При этом, обычно зависает на фазе filling или showing, реже idle, ещё реже outro (на самом деле давно не видела).
Нет никакой стабильности, даже в зависаниях.
По сути может зависнуть в любой момент.
В браузере раньше тоже зависал, но я каждый день работаю над улучшениями, уже долгое время работает хорошо.
Немного скриншотов:
[OBS](это зависло)
(прошу прощения за плохое качество, но это скриншот с уже зависшего OBS, крупнее сделать или скопировать уже нет возможности)

[Google Chrome](тут версия чуть-чуть старее, чем запускается сейчас в OBS, но менялся только мониторинг, по сути)
(при этом, он до сих пор работает и не собирается умирать, тьфу тьфу)

Все тесты я всегда провожу на отдельных мониторах (у меня их 3), при этом активность окна не теряют. Что OBS, что Браузер.
Я понимаю, что OBS использует несколько специфичную вещь Chromium Embedded Framework - для реализации источника "Браузер". Которая может работать чуть-чуть похуже. Но не на столько же?
По какой причине всё таки может виснуть OBS?
Может быть кто может подсказать на вскидку, пальцем в небо?
1) Я перед загрузкой предзагружаю все нужные мне ресурсы (кроме звуков и прямых картинок) (да и звуки для уведомлений я сейчас вообще убрала, так как были тестовые, а подходящие я ещё не нашла, времени и сил не было)
2) Интервалы и таймеры управляются единым "менеджером", утечек и "зомби" точно нет
3) Сессии показа уведомления выполнены в виде отдельного класса, который полностью уничтожается в конце своей работы. Есть ряд механик, которые помогают этому, если сессия вдруг "зависла".
4) Лишних объектов не создаю и не пересоздаю. Canvas всегда один, уведомление - по сути только меняю контент у нужных нод. И показываю\скрываю. Размер окна тоже не меняется.
5) Логирую всё что можно. Есть экранные логи (так как в OBS нету DevTools). Есть система логирования через WebSocket (относительно недавно добавила)
6) Есть монитор производительности, который сейчас стал уже очень детализированным.
7) Разумеется использую requestAnimationFrame (и cancelAnimationFrame), при этом рендер использует методику fixed timestep с аккумулятором - анимация работает одинаково что в OBS (там 60FPS стоит ограничение) и в Браузере (работает на максимум, 144FPS). Рендер сейчас идёт постоянно. Я пробовала включать\выключать по необходимости. Не помогло.
8) Есть периодическая "мягкая" перезагрузка системы. Где уничтожается всё кроме главного класса. И создаётся\инициализируется снова.
9) Утечек eventListener вроде нет (она потенциально может быть в "панели управления", которую я запускаю только в браузере, но браузер работает стабильно). Остальных событий не много и они точно уничтожаются, когда не нужны.
10) Утечек памяти тоже вроде-бы нет.
11) Всё что самое важное - ограничивается лимитами. Количество, время. Есть несколько фоновых периодических интервалов, которые мониторят состояние системы и показывают предупреждение или ошибку. Но ошибок и предупреждений - нет! Система просто тихо и внезапно умирает.
Единственное что смущает, это стабильное наличие "долгих" кадров.
Как, например, сейчас в браузере:
Время кадра: 0.0мс
Время кадра (макс): 986мс ⚠️
Время кадра (мин): 0.1мс
Время кадра (сред): 3.6мс
Это явно какая-то аномалия. Но это было всегда, с момента как добавила эту статистику в монитор производительности. И почему это происходит, я не знаю.
P.S.
Я пыталась и к нейросетям обращаться за помощью. Но учитывая почти 9 тысяч строк кода и полный исходник на 353кб. Ни одна нейросеть не сможет проанализировать систему целиком. Даже если давать классы по отдельности. Что-то находит. Потом, после моего объяснения, выясняется что это нормально в условиях "контекста".