Несколько лет назад я работал над разработкой приложений с множеством «сохраненных» систем графического интерфейса (ниже я расскажу о том, что я имею в виду), таких как MFC, QT, Forms, SWING и несколько структур веб-графического интерфейса. Я всегда находил концепции большинства систем с графическим интерфейсом слишком сложными и неуклюжими. Количество событий обратного вызова, слушателей, копий данных, что-то, что можно связать во что-то - преобразования (и т. Д.) Всегда были источником ошибок и головной боли по сравнению с другими частями приложения. (Даже при «правильном» использовании привязок данных / моделей).
Сейчас я пишу компьютерные игры :). До сих пор я работал с одним графическим интерфейсом: Miyagi (не очень известный, но в основном та же идея, что и все другие системы).
Это было ужасно.
В средах рендеринга в реальном времени, таких как Игры, у меня возникает ощущение, что «сохраненные» системы графического интерфейса еще более устарели. Пользовательские интерфейсы обычно не нуждаются в автоматической компоновке или имеют изменяемые размеры окон на лету. Вместо этого им необходимо очень эффективно взаимодействовать с постоянно изменяющимися данными (например, 3D-позициями моделей в мире).
Пару лет назад я наткнулся на «IMGUI», который в основном похож на режим Immediate Graphics, но для пользовательских интерфейсов. Я не уделял слишком много внимания, так как все еще занимался разработкой приложений, а сама сцена IMGUI казалась не слишком широкой и не успешной. Тем не менее подход, который они используют, кажется настолько сексуальным и элегантным, что я захотел написать что-то для следующего проекта, используя этот способ пользовательского интерфейса (я не смог никого убедить на работе: (...)
позвольте мне резюмировать, что я подразумеваю под «удержанным» и «немедленным»:
Сохраненный графический интерфейс: на отдельной фазе инициализации вы создаете «элементы управления графическим интерфейсом», такие как «Метки», «Кнопки», «Текстовые поля» и т. Д., И используете какой-то описательный (или программный) способ размещения их на экране - все до того, как что-либо будет отображено. Элементы управления хранят большую часть своего собственного состояния в памяти, такие как X, Y расположение, размер, границы, дочерние элементы управления, текст метки, изображения и так далее. Вы можете добавить обратные вызовы и слушателей, чтобы получать информацию о событиях и обновлять данные в элементе управления GUI.
Немедленный графический интерфейс: библиотека графического интерфейса состоит из однократных функций «RenderButton», «RenderLabel», «RenderTextBox» ... (редактировать: не запутайтесь в Renderприставка. Эти функции также выполняют логику за элементами управления, такие как опрос пользовательского ввода, вставка символов, обработка скорости повторения символов, когда пользователь удерживает клавишу, и т. Д.), Которую можно вызвать для «немедленной» визуализации элемента управления (не делает). Это должно быть немедленно записано в графический процессор. Обычно его запоминают для текущего кадра и позже сортируют по соответствующим партиям). Библиотека не содержит никакого «состояния» для них. Если вы хотите скрыть кнопку ... просто не вызывайте функцию RenderButton. Все функции RenderXXX, которые взаимодействуют с пользователем, например кнопки или флажки, имеют возвращаемые значения, которые указывают, например, нажал ли пользователь на кнопку. Так что твой "RenderGUI" функция выглядит как большая функция if / else, где вы вызываете или не вызываете функции RenderXXX в зависимости от состояния вашей игры, и вся логика обновления данных (при нажатии кнопки) включается в поток. Все хранилище данных находится «за пределами» графического интерфейса и передается по требованию функциям рендеринга. (Конечно, вы бы разбили большие функции на несколько или использовали бы некоторые абстракции классов для группировки частей графического интерфейса. Мы больше не пишем код, как в 1980 году, не так ли?)
Теперь я обнаружил, что Unity3D фактически использует тот же самый базовый подход к своим встроенным системам графического интерфейса. Возможно, есть пара GUI с таким подходом?
Тем не менее ... при взгляде вокруг, кажется, есть сильный уклон в сторону сохраненных систем графического интерфейса? По крайней мере, я не нашел такого подхода, кроме как в Unity3D, и первоначальное сообщество IMGUI кажется довольно .... тихим.
Так кто-нибудь работал с обеими идеями и имел какое-то твердое мнение?
Редактировать: меня больше всего интересуют мнения, основанные на реальном опыте. Я думаю, что на IMGUI-форуме много горячих дискуссий по поводу любой «теоретической слабости» непосредственного подхода с графическим интерфейсом, но я всегда нахожу более полезным узнать о реальных слабостях.