Сразу оговорюсь: это не технический разбор и не попытка кого-то чему-то научить. Просто заметка из личного блога о проекте, которым я занимался последние несколько лет. Здесь будет больше истории, наблюдений и личного опыта, чем сухих цифр и графиков.
В прошлых статьях я рассказывал про терминал и про AI. Можно было бы зайти и про DLL — но это «для зелёных», и многим будет непонятно, как оно работает на самом деле. Поэтому сегодня — про другое. Про то, как вы вообще что-то видите на экране. Про кодеки.
Разберём на примере Everty Desk Lite — нашего клиента удалённого доступа. И заодно расскажу, как мы протестировали захват картинки и её апскейл прямо на клиенте.
Небольшое лирическое отступление
Мой наставник, учитель информатики, ещё в 8 классе сказал мне: «Мы пишем 10% кода, а 90% — лечим». Не знаю, о чем он думал ночами, врать не буду. Но он мой ментор, а я его ученик. Только с годами пропорция стала жёстче: теперь каждый мой проект — это 1% кода и 99% отладки. Как проклятие.
Так вот, про отладку и кодеки.
Старая навязчивая идея
Идея родилась из простого наблюдения: у людей дома простаивают мощные игровые компьютеры, которые по ночам просто выключены. В то же время у миллионов пользователей есть дешевые ТВ-приставки (или старые Android-устройства). У этих приставок слабый процессор, но есть аппаратный кодек, способный без тормозов воспроизводить тяжелое видео.
Проект связывает их напрямую: спящий ночью ПК превращается в удаленный сервер и стримит топовые игры на копеечную приставку клиента.
Почему кодеки — это кошмар
Чтобы картинка с сервера долетела до вашего экрана и не превратилась в слайд-шоу, её нужно закодировать, передать и декодировать. И желательно — аппаратно, иначе на дешёвом железе всё умрёт.
Вот зоопарк, через который мир заставляет нас «видеть»:
-
Media Foundation (Windows)
-
DXVA / DXVA2 (Windows, аппаратное декодирование)
-
VideoToolbox (macOS / iOS)
-
MediaCodec (Android — тот самый аппаратный H.264, на котором всё и держится)
А под капотом — полная грязь: прослойки, обрезы, проприетарщина от Google, Microsoft, Apple. Туда же — AV1, мой личный фаворит. По мне — лучший кодек, имхо.
Создать кодек — это безумие. А создать его аппаратно — оооо. Я читал статью о том, как AI буквально «рисуют» на кремнии. Ребята, описать кодер на кремнии — это поклон в пояс. Весь мир творит здесь чудеса, и это правда впечатляет.
Что сделали мы
Я на время отошёл от основных проектов — хотелось рассказать, как круто в принципе творить. Так вот, что получилось:
На самом деле я в этой статье не буду рассказывать особенности аппаратного енкода и кодирования, это легкая статья просто хочется вести блог, если интересно спрашивайте.
Но поехали дальше:
-
У нас своя интерпретация AV1. Чертовски быстрая.
На дешевой приставке PC HI BOX TV A3 Light, я добился кошмарных результатов)
Справа приставка с подключенным по USB DualSense 5 — Слева пк с эмулятором ps2 (Все через WIFI5)
Главный результат, которым горжусь: играть можно даже на самой «старой» Android-приставке — на аппаратном H.264. И это, честно, звучит безумно.
Но круто) Разумеется если есть аппаратный кодек.
Тут я не буду рассказывать как я технически добивался такого отклика. Но функционально:
-
Native C++ core — UDP sender и видео декодер написаны на C++ через JNI, не через Java. Максимальная скорость на критическом пути.
-
TouchLatencySprint — отдельный accessibility service специально для минимизации задержки ввода. Это нетривиальная фича, немногие стриминговые решения так делают.
-
Adaptive ROI Split-Stream — стриминг с динамическим регионом интереса. Вместо полного кадра — умный выбор что сжимать сильнее.
-
GamepadBoost — отдельный путь обработки геймпада с приоритизацией.
-
Двойной транспорт — UDP (нативный через
NativeUdpSender.cpp) + TCP tunnel fallback, переключение на лету.
Архитектура Control Plane:
-
Managed session lifecycle с NAT probe, relay fallback, route policy diagnostics.
-
Биллинг с тремя режимами провайдера (manual / external stub / real HTTP).
-
Device auth + user auth, JWT access/refresh.
-
Persistence с restart recovery (snapshot state.json).
-
Полный smoke-test suite под каждый слой.
Мультиплатформенность:
-
Android sender (Kotlin + C++)
-
Desktop receiver/client (Avalonia / .NET, кроссплатформа)
-
ASP.NET Core backend — Docker-ready из коробки.
Зачем это всё (и при чём тут Everty Desk)
Тот же стек кодеков, что делает возможным облачный гейминг на копеечном железе, — это ровно то, на чём живёт удалённый доступ. Низкая задержка, аппаратное декодирование, умный апскейл — в Everty Desk это не «для игр», это база комфортной удалёнки. Просто игры — самый жестокий стресс-тест: если тут картинка летит плавно, то рабочий стол подавно. Тут то, что мы пытаемся подружить с обычным удаленным доступом.
Вместо вывода
Этот проект родился не из сухих графиков или желания просто заработать. Он родился из личной боли и усталости. Я помню, каково это — страдать от отсутствия помощи, когда у тебя есть идея, но нет ресурсов, поддержки или нужного железа под рукой
Сегодня без технических примеров.
https://github.com/vaalimusic/EvertyGame
Собирайте и играйте.
info@everty.ru
ссылка на оригинал статьи https://habr.com/ru/articles/1043420/