Когда Хочешь Красивый Графический Интерфейс, Но Нет Графического Процессора

Обычно работающие утилиты не требуют вменяемого пользовательского интерфейса, с кнопками, списками, окнами, поддержкой мыши и прочими мелочами; большинство рабочих «хотелок» можно упаковать в скрипты и иногда запускать их с параметром --help, и это будет даже правильнее с точки зрения конфигурации и масштабирования.

Все становится еще хуже, когда инструментами начинает пользоваться не только команда разработчиков, но и сторонние люди.

Но они не всегда готовы вникать в связные мысли, содержащиеся в строках кода.

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

Некоторое время назад я работал над небольшой системой вентиляции/отопления/управления камерой и прочим «что бы там ни придумал этот парень в желтом шлеме» для подземной парковки.



Когда хочешь красивый графический интерфейс, но нет графического процессора

(Там была картинка из системного UI, но разработчик попросил ее удалить.

Если не хотите читать про хождение по рейковому полю, то ссылки на гитхаб есть в конце статьи) Система построена на китайской безымянной SoC, для которой производитель постарался портировать фреймворк SDL первой версии.

Внутренние инструменты и скрипты были улучшены до такой степени, что превратились в разросшийся и «красивый» макет с вкладками, списками, всплывающими окнами, тенями, градиентами, прозрачностью и прочими вкусностями.

Для реализации всех красот был выбран наногуй, простой и неприхотливый, и в то же время «мощный» по всем необходимым.

Именно на бумаге это было, но про OpenGL враги забыли.

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

Сначала грешили на мои кривые руки, потом на руки Антохи, разработчика, отвечающего за драйвера и железо, потом запустили тестовый пример рендеринга треугольника из SoC SDK, и снова черный экран, документация и примеры такие, как обычно, последнее, что читаю.

Мы с коллегой подумали, что здесь что-то не так и зашли сначала на китайский форум, и не найдя там внятных ответов разработчика, ответ разочаровал, реализации opengl нет и скорее всего не будет, потому что линия снимается с производства.

— А как насчет фреймворка SDL? - мы спросили — Рисуем попиксельно в видеопамять.

— Нам ответили наши китайские друзья.

В тот день я увидел грустные глаза программиста, который считал, сколько LoC он отправит в /dev/null. Но выбрасывать готовое решение было очень обидно, (всё можно найти в интернете) оказывается в nanogui можно жить и без OpenGL используя программный рендерер.

Но жизнь оказывается очень медленной, на большом ПК пару секунд на кадр, на китайском чуде инженерной мысли уже около 20-25 секунд на рендеринг.

Тогда решили не рендерить весь UI сразу, а только нужные (измененные) части виджетов, но даже в этом режиме, со всеми хаками и оптимизациями, уходило более 10 секунд на кадр, что было нежизнеспособно.

.

Покурив несколько примеров SDK, мы выяснили, что копирование готовых текстур в видеопамять происходит «мгновенно» (по сравнению с 10 секундами, конечно), и занимает примерно 1мс для текстуры 512х512 без прозрачности и 2мс для такой же с прозрачностью.

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

для не совсем мертвого интерфейса мы можем копировать не более 50-100 текстур за кадр и не сразу, а только дождавшись, пока видеодрайвер возьмет данные из буфера .

Следующей итерацией был рендеринг виджета в собственную текстуру в потоке, и пока текстура создавалась, виджет отрисовывался примерно аналогично конечному результату, только квадратным образом; всевозможные линии и формы можно было бесплатно рисовать прямо в видеопамяти.

Почти победив чудо китайской мысли «без» GPU, 20 FPS всё равно нельзя назвать достойным результатом, и почти сдав проект, я попросил у заказчика разрешения вынести часть наработок в открытый исходный код. Первый SDL сейчас не очень моден, поэтому было решено использовать рендер nanogui в программном режиме на SDL2 и выложить на Github. Может кому-то понадобится :) Дочитав статью до конца, %habrowser% имеет право спросить, зачем возникла необходимость отгораживать эту кучу кода ради скругленных углов и теней? Во-первых, это красиво (с), во-вторых, «вот тот парень в желтом шлеме» уже заплатил за разработку системы и закругленные углы там, к сожалению (или к счастью) были включены в спецификацию, осталось только сделать их градиентом и добавить немного теней.

Это было оригинальное лето 2017 года в солнечном Сочи.

Вот как выглядит рендер OpenGL

Когда хочешь красивый графический интерфейс, но нет графического процессора

Вот как выглядит программный рендеринг на ПК

Когда хочешь красивый графический интерфейс, но нет графического процессора

Ссылки : Оригинальный wjakob/nanogui Программный рендеринг NanoVG NanoGUI + SDL + программный рендеринг P.S. Не верьте китайским разработчикам, которые говорят о наличии OpenGL в системе, проверяйте работоспособность всех компонентов, вам лучше знать как :) Теги: #C++ #ui #Работа с векторной графикой #никто не читает теги #nanogui

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.