Обычно работающие утилиты не требуют вменяемого пользовательского интерфейса, с кнопками, списками, окнами, поддержкой мыши и прочими мелочами; большинство рабочих «хотелок» можно упаковать в скрипты и иногда запускать их с параметром --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
-
Шаги По Созданию И Продвижению Rss-Каналов
19 Oct, 24 -
Ключ К Завершению Проекта
19 Oct, 24 -
Зачем Вашей Организации Нужен Сайт
19 Oct, 24 -
Хиншелвуд, Сирил Норман
19 Oct, 24 -
Перерезка Кабеля В 2019 Году
19 Oct, 24 -
Бэринг Восток Купил Весь Ozon
19 Oct, 24