LINUX.ORG.RU

Бывают ли человечьи Immediate Mode GUI?

 , imgui


0

2

Я тут столкнулся с понятием Immediate Mode GUI. Начинается там все со стандартного «MVC плёха» но дальше чувствуется запах серы :). Я в принципе положительно отношусь к выпиливанию стейтов, но делать это ценой смешивания кода со всем чем-то можно - как-то подозрительно. Как там анимацию приделывать - вообще непонятно.

Там есть вообще какая-то приличные по современным меркам реализации, пригодные на что-то большее чем накладывание субтитров на видео? Возможно мне попадались не самые лучшие библиотеки.

★★★★★

Ответ на: комментарий от RazrFalcon

Чем вариант запуска потока не подходит? Если функция затратная, то стоимость запуска потока ничтожна.

monk ★★★★★
()
Ответ на: комментарий от loz

Я просто не пойму как это будет выглядеть.

В том же Qt, работа и отрисовка виджетов - отдельно. Соответственно сама отрисовка зависнуть не может (не считая быдлокода). А работа будет выполнятся между фазами отрисовки.

А здесь получается, что если я при нажатии кнопки что-то долгое начну делать, то остальные виджеты не отрисуются, пока работа не выполнится. Как это визуально выглядит - не представляю.

Если они рисуют в буфер, а не сразу на экран, то получим ненажатую кнопку, которая на самом деле нажата. Так как «кадр» предыдущий.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

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

loz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Соответственно сама отрисовка зависнуть не может

Даже если в обработчике сигнала затратная функция?

Если они рисуют в буфер, а не сразу на экран, то получим ненажатую кнопку, которая на самом деле нажата. Так как «кадр» предыдущий.

В буфер. Неотпущенную. «Нажатие» происходит при отпускании кнопки мыши.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Плодить потоки на каждый клик?

Не на каждый клик, а на каждую затратную функцию.

Разве не быдлокод?

Нормальная штатная работа. Потоки для этого и придумали.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Нужно изобретать колесо.

Зато всё работает быстро и ожидаемо. И бинарник с огромной кучей элементов (демка со всеми возможными виджетами) занимает 500КБ и работает крайне быстро (в отличие от Gtk или Qt, которые заметно подтормаживают на изменении размера окна)

monk ★★★★★
()

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

в Unity3d Editor гуй так работает, даже кроссплатформенно.

но это не значит, что так надо делать. очень много боли.

по сути стейт вынесен наружу из виджетов.

если приделывать анимацию — то точно так же. стейт анимации хранить отдельно, а виджетам в frameUpdate говорить его дергать.

waker ★★★★★
()
Ответ на: комментарий от monk

Сравнили отрисовку графических примитивов с полноценным тулкитом. Ну вы даёте.

Я молчу о том, что imgui и им подобные не умеет в нормальную отрисовку текста. Загрузил фиксированный шрифт в атлас и с ним работаешь. Ужас.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Сравнили отрисовку графических примитивов с полноценным тулкитом. Ну вы даёте.

Если скорость неважна, а нужен «полноценный тулкит», то можно вообще на электроне интерфейс делать.

Если же программа без графики занимает 200КБ, то как-то глупо только ради интерфейса присобачивать от 20МБ до пары гигабайтов.

Я молчу о том, что imgui и им подобные не умеет в нормальную отрисовку текста. Загрузил фиксированный шрифт в атлас и с ним работаешь.

ЩИТО???

https://github.com/ocornut/imgui/blob/master/misc/fonts/README.txt

https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp#L3035

Хоть на каждый виджет разный шрифт делай.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

то как-то глупо только ради интерфейса присобачивать от 20МБ до пары гигабайтов.

Ну так у вас выбор или Qt или хрень из говна и палок. Если вы для себя пишите гуи - пишите хоть на tk/motif. Но нормальным людям такое не показывайте.

ЩИТО???

right-to-left, bidi reordering, glyph fallback. Это всё умеет? Насколько я знаю - нет.

Покажите скриншот этого текста: اقرأ المزيد عن SVG أيضًا.

Или: This is «مرحبا العالم!» Arabic.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

Ну так у вас выбор или Qt или хрень из говна и палок. Если вы для себя пишите гуи - пишите хоть на tk/motif. Но нормальным людям такое не показывайте.

Покажете нормальный гуи, умещающийся в 500КБ бинарника и не тормозящий на полусотне элементов на современном компьютере?

right-to-left,

Нет, но достаточно легко можно сделать.

bidi reordering

Это вообще зло в применении к произвольным строкам. И при редактировании к положению курсора.

glyph fallback

Да: https://github.com/ocornut/imgui/blob/master/imgui_widgets.cpp#L3446

monk ★★★★★
()
Ответ на: комментарий от monk

Покажете нормальный гуи

Только нативный тулкит. PS: imgui и подобные, нормальными не являются.

Нет, но достаточно легко можно сделать.

А вот и нет.

Это вообще зло в применении к произвольным строкам. И при редактировании к положению курсора.

Мне ненужно - никому ненужно? Так и запишем.

Да

Нет. Это замена пароля на звёздочки.

Подсказка: нормальная поддержка отрисовки текста будет раз в 5 больше чем весь ваш imgui.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Только нативный тулкит.

В смысле, X Window, WinAPI, Quartz?

А вот и нет.

Один флажок и исправить в RenderText вычисление позиции символов.

Мне ненужно - никому ненужно? Так и запишем.

А кому-то нужно писать латинские буквы справа-налево или арабский текст слева-направо? Зачем?

monk ★★★★★
()
Ответ на: комментарий от monk

Я не сильно шарю в том как работают биндинги/хидеры C++ -> C, ты не знаешь случаем как мне скомпилить .so с «сишной версией» imgui?

loz ★★★★★
()
Ответ на: комментарий от monk

В смысле, X Window, WinAPI, Quartz?

Скорее Qt, WPF, Cocoa.

Один флажок и исправить в RenderText вычисление позиции символов.

Святая наивность.

А кому-то нужно писать латинские буквы справа-налево или арабский текст слева-направо? Зачем?

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

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

А потом эти люди рассказывают какой Qt жирный, сравнивая с либами, которые ничего не умеют.

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

Всё равно, что для того, чтобы заварить чай, использовать универсальный кухонный комбайн весом 20 тонн, умеющий готовить все блюда всех кухонь мира (в том числе чай). На фоне такого комбайна обычный заварочный чайник «ничего не умеет». Но он умеет заваривать чай.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 2)
Ответ на: комментарий от loz

получил 500K либу за пол секунды - и это все чтоли? :)

Нет. Там лучше make сделай. В общем, от самого imgui ещё объектники нужны.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Так суть разницы между ними - это внутри либы ивентлуп или снаружи. В первом случае нужны колбеки и виджеты, во втором вручную управляешь циклом. Вобщем небольщая разница.

loz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Всмысле цикл написать? Ну не хочешь - не пиши.

loz ★★★★★
()
Ответ на: комментарий от monk

Слушай какая-то полная борода у них с GL, пытаюсь скомпилить пример получаю `./etest.so: undefined symbol: gl3wProcs` при этом `#include «gl3w.h»` подключен, не могу понять достаточно этого или чеще so-шка какая-то от них нужна?

loz ★★★★★
()
Ответ на: комментарий от loz

И это пофиксил, теперь `undefined symbol: glfwSetScrollCallback`

При этом оба imgui/examples/imgui_impl_glfw.cpp и imgui/examples/libs/glfw/include/GLFW/glfw3.h подключены..

loz ★★★★★
()
Ответ на: комментарий от monk

Нет конечно)

Поставил, теперь такое:

> ls /usr/lib/x86_64-linux-gnu/ | grep libglfw
libglfw.so.3
libglfw.so.3.2
> make etest
g++ -o etest.so cimgui.o ./imgui/imgui.o ./imgui/imgui_draw.o ./imgui/imgui_demo.o ./imgui/imgui_widgets.o ./imgui/examples/imgui_impl_glfw.o ./imgui/examples/imgui_impl_opengl3.o -O2 -I./imgui/ -I./imgui/examples/libs/gl3w/ -I./imgui/examples/libs/glfw/include/ -Wall -shared -fPIC -I/home/user/.asdf/installs/erlang/20.0/usr/include -lGL -lglfw imgui/examples/libs/gl3w/GL/gl3w.c etest.c
/usr/bin/ld: cannot find -lglfw
collect2: error: ld returned 1 exit status
Makefile:60: recipe for target 'etest' failed
make: *** [etest] Error 1

loz ★★★★★
()
Ответ на: комментарий от Deleted

Хм, сработало, а в чем смысл - я всегда думал что `-dev` это хидеры а для работы обычной .so достаточно

loz ★★★★★
()
Ответ на: комментарий от loz

Это еще и библиотеки! .so это dll, но не библиотеки которые юзает gcc.

Deleted
()
Ответ на: комментарий от RazrFalcon

И тягать его с собой на винду и мак? Не вижу логики.

Сарказм не улавливаешь? То что придётся его таскать на UNIX - это нормально?

Если брать традиционные библиотеки, то уж лучше fltk.

monk ★★★★★
()
Ответ на: комментарий от monk

То что придётся его таскать на UNIX - это нормально?

На UNIX он 100% есть, так как все браузеры на нем, GIMP на нем, да почти все крутые приложения.

Deleted
()
Ответ на: комментарий от Deleted

Ну так gtk это практически нативный гуй под линуксом.

Где-то gtk, где-то Qt, где-то ни того ни другого. Нативный гуй под линуксом называется X.

monk ★★★★★
()
Ответ на: комментарий от loz

monk, VarfolomeyKote4ka

Спасибо, офигеть, сработало! Запустил из эрланга через NIF. Попробую сделать либу для интерфейсов.

Хардкорная компиляция конечно в этой сишечке.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 2)
Ответ на: комментарий от monk

где-то Qt

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

Нативный гуй под линуксом называется X.

Wayland!

Deleted
()
Ответ на: комментарий от Deleted

На UNIX он 100% есть, так как все браузеры на нем,

dillo, falkon, konqueror не на нём

GIMP на нем,

Он нужен не всем.

да почти все крутые приложения.

С этой постановкой он и на Win/Mac есть.

monk ★★★★★
()
Ответ на: комментарий от monk

dillo, falkon, konqueror не на нём

Еще w3m не на нем, значит НУЖНО включать использование sixel!!! Иначе можно сразу, на иксах делать. %)

Он нужен не всем.

Я просто привел его как пример, есть много gtk приложений которые нельзя заменить.

С этой постановкой он и на Win/Mac есть.

Есть. Однако у них гуй вшит, а на линуксе его можно и не ставить.

Deleted
()
Ответ на: комментарий от Deleted

В чем разница между nuklear и dear imgui? Первый по виду вобще без зависимостей, но как он рисует тогда?

Edit: увидел там тоже opengl присутствует

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от Deleted

Эксперты в треде, расскажите, чем imgui лучше nuklear?

Тем, что там есть готовые реализации под GLFW/SDL. И тем что в нём не переписываются заново POSIX функции (как nk_itoa, nk_vsnprintf и т.д. в nuklear)

monk ★★★★★
()
Ответ на: комментарий от loz

но как он рисует тогда

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

Ну прям писать драйверы не нужно, они уже есть https://github.com/vurtun/nuklear/tree/master/demo но свой написать будет легче легкого, причем как для попиксельного вывода, так и для опенжиэльного.

Deleted
()
Ответ на: комментарий от monk

Тем, что там есть готовые реализации под GLFW/SDL.

У nuklear тоже есть, причем их много.

И тем что в нём не переписываются заново POSIX функции (как nk_itoa, nk_vsnprintf и т.д. в nuklear)

Это для неюниксовых систем видимо, но это все отключается одним #define'ом.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.