Другое

Почему виджет OBS зависает через несколько часов?

Узнайте основные причины зависания виджетов OBS в долгосрочной работе и эффективные решения для стабилизации работы ваших виджетов с анимациями и QR-кодами.

Почему виджет для OBS зависает через несколько часов работы? У меня разработан полноэкранный виджет для OBS, который показывает уведомления с анимациями и иногда QR-кодами. Виджет написан на PHP, HTML, CSS и JavaScript (около 9000 строк кода). В браузере он работает стабильно, но в OBS зависает через разное время: от 32 минут до 21.5 часов. Зависания происходят в основном на фазах filling или showing. Я уже предзагружаю ресурсы, использую единый менеджер таймеров, реализую сессии уведомлений как отдельные классы с корректным уничтожением, ограничиваю создание объектов, веду логирование, использую requestAnimationFrame с fixed timestep, реализовал периодическую мягкую перезагрузку системы. Утечек памяти и eventListener не обнаружено. Единственное аномальное наблюдение - наличие ‘долгих’ кадров (до 986ms), но это было всегда и не связано с зависаниями. В чем может быть причина таких зависаний в OBS, особенно учитывая, что OBS использует Chromium Embedded Framework для источника ‘Браузер’?

Основная причина зависания вашего виджета в OBS через несколько часов работы, скорее всего, связана с особенностями работы Chromium Embedded Framework (CEF) в долгосрочном режиме, особенно когда речь идет о сложных анимациях и ресурсоемких операциях. В отличие от обычного браузера, CEF в OBS имеет ограничения по управлению ресурсами, памяти и процессорному времени, которые могут накапливаться со временем и приводить к зависанию, особенно на фазах рендеринга анимаций.

Содержание


Основные причины зависаний в OBS Browser Source

Из анализа форумов и проблемных случаев можно выделить несколько ключевых причин, почему виджеты зависают в OBS через несколько часов работы:

Проблемы с управлением ресурсами CEF

CEF (Chromium Embedded Framework), используемый OBS для Browser Source, имеет встроенные ограничения на использование ресурсов. В отличие от обычного браузера, где процессы могут перезапускаться автоматически, в OBS долгосрочная работа одного экземпляра может приводить к накоплению проблем:

  • Утечки памяти в CEF: Даже при отсутствии явных утечек в вашем коде, сам CEF может аккумулировать память со временем
  • Ограничения процессорного времени: OBS может ограничивать CPU time для browser sources при высокой нагрузке
  • Проблемы с garbage collection: Встроенный в CEF JavaScript engine может некорректно обрабатывать долгосрочные процессы

Конфликты с графическими драйверами

Как показывают многие пользователи, проблемы часто связаны с настройками графических драйверов:

“Моя проблема (зависание/дрожание) при воспроизведении видео с помощью browser source была вызвана изменениями, которые я внес в настройки 3D NVIDIA / глобальные настройки страницы” [источник]

Особенно часто проблемы возникают при:

  • Ограничении частоты кадров в фоновом режиме
  • Агрессивных настройках энергосбережения
  • Конфликтах между режимами работы GPU

Специфика работы CEF в OBS

Различия между обычным браузером и CEF

Ваш виджет работает стабильно в обычном браузере, но зависает в OBS, потому что CEF имеет существенные отличия:

  • Ограниченные API: Некоторые браузерные API могут быть недоступны или работать иначе
  • Изолированная среда: CEF работает в более ограниченной среде с меньшим количеством системных ресурсов
  • Отсутствие автоматических перезапусков: В браузере вкладки могут перезапускаться автоматически, в CEF такого механизма нет

Проблемы с долгосрочными анимациями

Поскольку ваши зависания происходят в основном на фазах “filling” или “showing”, это указывает на проблемы с рендерингом анимаций в долгосрочном режиме:

javascript
// Пример проблемы с requestAnimationFrame в CEF
function animate() {
    // В обычном браузере этот код будет работать стабильно
    // Но в CEF при длительной работе могут накапливаться проблемы
    requestAnimationFrame(animate);
    updateAnimation();
}

Влияние настроек графических драйверов

NVIDIA Control Panel проблемы

Многие пользователи сообщали, что проблемы с browser source в OBS напрямую связаны с настройками NVIDIA:

“Это определенно проблема. Для меня отключение ускорения браузера в OBS решило проблему, когда стримы Twitch зависали случайным образом. Однако это не отличное решение, так как это приводит к ужасной производительности в целом” [источник]

Рекомендуется проверить:

  • Настройки ограничения частоты кадров в фоновом режиме
  • Глобальные настройки 3D-приложений
  • Настройки энергосбережения

Решения для графических настроек

  1. Отключите ограничение FPS для browser sources в настройках NVIDIA
  2. Установите режим производительности вместо энергосбережения
  3. Обновите графические драйверы до последней версии

Проблемы с памятью и ресурсами

Накопление ресурсов со временем

Даже при правильном управлении памятью в вашем коде, CEF может накапливать ресурсы:

  • Кэширование текстур: Анимации и изображения могут кэшироваться в памяти
  • JavaScript контексты: Долгосрочные сессии могут накапливать контексты
  • Сетевые ресурсы: Загружаемые QR-коды и уведомления могут храниться в кэше

Влияние версии OBS

Проблемы часто возникают после обновлений OBS:

“Раньше в версии 30.2 наш оверлей работал с перебоями. Однако в версии 31, выполнение более чем пары операций легко замораживает все видео, которые рендерятся, и они зависают на экране” [источник]

Рекомендуется:

  • Проверить, с какой версии OBS начались проблемы
  • Вернуться к предыдущей стабильной версии если необходимо
  • Отслеживать обновления CEF в новых версиях OBS

Решения и методы устранения

Периодический перезапуск виджета

Поскольку ваша проблема возникает через несколько часов, реализуйте механизм периодического перезапуска:

javascript
// Пример мягкого перезапуска через 2 часа
let lastRestartTime = Date.now();
const RESTART_INTERVAL = 2 * 60 * 60 * 1000; // 2 часа

function checkRestart() {
    if (Date.now() - lastRestartTime > RESTART_INTERVAL) {
        performSoftRestart();
        lastRestartTime = Date.now();
    }
    setTimeout(checkRestart, 30000); // Проверка каждые 30 секунд
}

Оптимизация использования ресурсов

  1. Ограничение количества одновременных анимаций
  2. Использование CSS анимаций вместо JavaScript где возможно
  3. Оптимизация изображений и QR-кодов
  4. Реализация механизма очистки неиспользуемых ресурсов

Мониторинг производительности

Реализуйте мониторинг производительности в реальном времени:

javascript
// Мониторинг длинных кадров
let frameCount = 0;
let lastFrameTime = performance.now();

function monitorPerformance() {
    const currentTime = performance.now();
    const frameDuration = currentTime - lastFrameTime;
    
    if (frameDuration > 100) { // Больше 100мс
        console.warn(`Длинный кадр: ${frameDuration}ms`);
        logFramePerformance(frameDuration);
    }
    
    lastFrameTime = currentTime;
    requestAnimationFrame(monitorPerformance);
}

Рекомендации по оптимизации

Настройки OBS для Browser Source

  1. Отключите аппаратное ускорение если это вызывает проблемы
  2. Ограничьте частоту кадров для browser source
  3. Используйте отдельные источники для разных типов контента
  4. Оптимизируйте разрешение browser source

Технические оптимизации для вашего виджета

  1. Реализуйте механизм предзагрузки всех ресурсов
  2. Используйте веб-воркеры для тяжелых вычислений
  3. Оптимизируйте CSS анимации с помощью will-change
  4. Реализуйте кэширование для QR-кодов и статических элементов

Альтернативные подходы

Если проблема persists, рассмотрите:

  • Создание виджета как отдельного приложения, отображаемого через Window Capture
  • Использование OBS WebSockets для взаимодействия с внешним приложением
  • Переход на другие технологии отображения контента

Источники

  1. Browser Source freezing | OBS Forums
  2. Video performance issues in web browser source in 31 · Issue #470 · obsproject/obs-browser
  3. OBS Browser Sources and Dockers have performance issues while Hardware Acceleration is enabled
  4. Browser sources freezing after some time | OBS Forums
  5. Browser source causes PC to freeze up using 27.2.0 · Issue #5974 · obsproject/obs-studio
  6. OBS Studio 27.2.0 System Freezing Bug
  7. Browser Source Videos freezing | OBS Forums
  8. Performance issues & Computer Crashing/Hanging when Streaming | OBS Forums

Заключение

Основная причина зависания вашего виджета в OBS через несколько часов работы кроется в специфике работы Chromium Embedded Framework в долгосрочном режиме, особенно при сложных анимациях. Для решения проблемы рекомендуется:

  1. Проверить и оптимизировать настройки графических драйверов, особенно ограничения FPS
  2. Реализовать механизм периодического мягкого перезапуска виджета каждые 2-4 часа
  3. Оптимизировать использование памяти и процессорного времени в вашем коде
  4. Рассмотреть возможность создания виджета как отдельного приложения через Window Capture
  5. Отслеживать обновления OBS и CEF, так как многие проблемы были исправлены в новых версиях

Ваше наблюдение о “длинных” кадрах (до 986ms) действительно может быть индикатором накопившихся проблем с производительностью, даже если они не напрямую связаны с зависаниями. Регулярный мониторинг этих показателей поможет выявлять проблемы на ранней стадии.

Авторы
Проверено модерацией
Модерация