Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос CS2 Discord Overlay — Оптимизация SendFrame и фикс статтеров

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
538
Реакции
14
Народ, кто плотно ковырял либу DiscordOverlay (которая от JoakimCarlsson) для внешних софтов? Столкнулся с классической проблемой прикручивания рендера к CS2, когда на бумаге всё красиво, а на деле — оверлей ложится при любом чихе Дискорда.

Суть проблемы:
Пытаюсь прокинуть свои фреймы в пайп Дискорда. Изначальный код заводится, но как только в самом Дискорде начинается какая-то активность (например, залетает входящий вызов), весь оверлей просто отваливается.

Попробовал завернуть всё в бесконечный цикл, чтобы принудительно обновлять картинку:

Код:
Expand Collapse Copy
namespace cs2_external.Discord
{
    public class Hook
    {
        public static void Start(Process process)
        {
            var frame = new Frame(1920, 1080);
            var processInfo = new GraphicsPipe.ConnectedProcessInfo { ProcessId = process.Id };
           
            if (!GraphicsPipe.ConnectToProcess(processInfo))
                return;

            while (true)
            {
                Drawing.ClearCanvas(frame);
                Drawing.DrawString(frame, "Testing Overlay", 50, 50, SKColors.White, 13);
                GraphicsPipe.SendFrame(processInfo, frame.Width, frame.Height, frame.Buffer, frame.Size);
            }
        }
    }
}

Технические грабли:
  1. Производительность улетает в трубу. Метод SendFrame — это узкое горлышко. Гонять 1080p фреймы в while(true) без какой-либо синхронизации — гиблое дело, CPU долбится в сотку, а FPS в игре проседает.
  2. Конфликты с самим Дискордом. Похоже, когда DiscordOverlay пытается отрисовать свои элементы (уведомления, плашки звонков), наши хуки начинают драться за буфер, и всё ломается.

Что нужно допилить:
Очевидно, что нужно как-то оптимизировать передачу кадров. Возможно, стоит слать фрейм только при изменении данных или привязаться к вертикальной синхронизации. Также открыт вопрос, как грамотно обрабатывать прерывания от самого Дискорда, чтобы оверлей не крашился при каждом уведомлении.

Кто уже наступал на эти грабли и фиксил производительность GraphicsPipe? Поделитесь кусками кода или направьте, куда копать, чтобы не изобретать велосипед с нуля.

Кто юзал этот метод в реальных проектах, отпишитесь по стабильности.
 
Назад
Сверху Снизу