Обновить

Сравниваем современные подходы к разработке десктопных приложений на веб‑технологиях: ElectroBun, NeutralinoJS и Wails

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.4K
Всего голосов 11: ↑10 и ↓1+13
Комментарии18

Комментарии 18

Лучшее десктопное приложение это то, что не делается вебом.

Пару недель назад попытался на Rust + Tauri накидать довольно простое приложение. Надо забрать кадры из внешней железки (DeckLink UltraStudio HD Mini), показать их на экране и положить на диск. С тем чтобы забрать кадры и положить на диск - проблем особых не возникло, но отобразить их - к сожалению в Tauri у меня так и не получилось. Я не очень хорош в Web технологиях и скорее всего сделал что-то не так, но с лету другого решения не нашел.
Кадры в YUV преобразовал в RGB, потом в base64, просунул через IPC в WebView и отобразил на Canvas. Больше всего времени занимала передача данных от бэка на фронт. По этой причине не удалось добиться 1080p50. Подключил Cursor в этот процесс и не особо вдаваясь в подробности - попросил оптимизировать. Не вышло.
За за пару запросов - фронт был сменен с Tauri на egui. 1080p50 поехало без особых проблем. С задержкой в 2 кадра от входного сигнала.
Резюмируя.
Пока нет необходимости гонять кучу данных с бека на фронт - WebBased Desktop фреймворки норм. Но как только появляется нагрузка на IPC - пиши пропало.

Да, связь бэкенда с фронтендом в данном случае самое слабое место всех подобных приложений.

IPC встроенный в электрон и другие никогда не предназначался для тяжелых задач. UI обновить или что то такое. Без дополнительного сервера с http/tcp/ip не обойтись.

Хотя это, на мой взгляд, упущение. Под капотом просто json сериализаторы, но ничего бы не мешало что-то по серьезнее сделать

из интересных есть ещё Dioxus.

Видео через Base64, извините, но вы тот ещё извращенец! Это же битовый формат, неэффективно его в текстовый и обратно переводить. Web давно освоил аудио и видео потоки без всяких фреймворков.

Раз уж вы так высказываетесь обо мне - расскажите пожалуйста подробнее, как мне правильно решить поставленную задачу, я обязательно попробую снова.

Извините, я не хотел вас задеть. Хотя мне не очень ясна ясна поставленная задача, но уверен, уже есть готовый инструмент под неё.

  1. Если задача отобразить видео на экране ПК, к которому подключена ваша железка UltraStudio HD Mini, то от производителя есть программа UltraStudio, которая покажет видео на экране и на диск положит. Или старый добрый OBS Studio.

  2. Если отобразить видео на удалённом ПК через Интернет, то те же UltraStudio / OBS Studio умеют стримить в куче форматов (https://www.blackmagicdesign.com/products/ultrastudio/software , раздел Broadcast). Клиентской программой может быть почти любой видеоплеер.

  3. Если отобразить видео в веб-приложении (то что вы попытались сделать) то на ПК подключенном к железке поставьте стриминговый сервер, умеющий получать видеопоток и пересылать веб-клиентам:

  • Nginx + модуль RTMP/HLS

  • SRS

  • MistServer

  • MediaMTX

  • Janus WebRTC

  • тот же OBS Studio

А в вашем веб-приложении на html странице укажите в теге <video> адрес видеопотока на сервере.

Если никакой готовый софт не подошёл и кроме клиента вы хотите завелосипедить и сервер, то передавайте поток через socket (websocket если у вас веб-сервер).

Все верно, я не до конца объяснил задачу. Разумеется, я понимаю что такое WebRTC / RTMP / HLS. Смысл в том, чтобы делать это все без задержки и с минимальной нагрузкой на железо. Все что вы предлагаете - кодирует / декодирует видео для того чтобы его просто показать. В том что у меня в конечном итоге получилось - только цветовое преобразование из YUV в RGB и задержка в 1-2 кадра от источника.
OBS очень люблю как софтинку и многими решениями - вдохновляюсь для выполнения своих задач. (В ней кстати похожим образом реализован показ, только там ещё отдельно обрабатывается звук и синхронизируется с видеопотоком) Но из нюансов - используется сглаживание, которое не возможно отключить.

Поддерживаю! Автор издевается.

Бинарные вебсокеты решили бы проблему идеально. Уверен они уже реализованы на всех ЯП. Сервер на бэке, клиентом подключайтесь и лить прям в текстуру GPU без преобразований или Canvas

Даёшь натив!

Tauri я в этот список включать не стал, так как учить Rust

Tauri можно пользоваться без знания Rust. достаточно привычных вам js/ts.

Ага, Go (Wails) можно было по той же причине не включать ;)

Спасибо, крутое сравнение и правда!

Ещё сделал такой вариант: сервер на delphi7 в 343 кб запускает установленный в windows браузер Chrome в режиме приложения и показывает в нем указанный html+js. При этом js может всё что и delphi, а если не хватит можно добавить. И ещё там можно создать один exe файл, который включит в себя всё что нужно в упакованном виде и будет работать, не требуя других файлов. Таким способом сделал плеер ТВ из интернета в 514 кб и анимацию картинок: https://github.com/prog-mania/fani/blob/main/fani.exe

Вспомнил ещё один старый способ создать exe приложение из html+JS, используя программу mshta.exe, входяшую в windows. Хотя JS в mshta без излишеств, зато есть доступ к системе через activX. Поэтому сервер не нужен и exe может быть маленький. Например, игра крестики-нолики всего 17 кбайт: https://github.com/prog-mania/fani/blob/main/h2exe/xo.exe

Спасибо, интересное!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации