Я працював над розробкою додатків з великою кількістю «збережених» GUI-систем (нижче докладніше про те, що я маю на увазі під цим), таких як MFC, QT, Forms, SWING та декілька веб-GUI-фреймів кілька років тому. Я завжди знаходив концепції більшості систем GUI надмірно складними та незграбними. Кількість подій зворотного дзвінка, слухачів, копій даних, щось до чогось - це конверсії (і так далі) завжди були джерелом помилок і головних болів порівняно з іншими частинами програми. (Навіть при "правильному" використанні прив'язки даних / моделей).
Зараз я пишу комп’ютерні ігри :). Я працював з одним GUI до цього часу: Miyagi (мало відома, але в основному та сама ідея, що і всі інші системи.)
Це було жахливо.
Для середовищ візуалізації в режимі реального часу, таких як Ігри, я відчуваю, що "збережені" системи GUI ще більше застаріли. Користувацькі інтерфейси, як правило, не потребують автоматичного розкладки або вікон із зміною розміру під час руху. Натомість їм потрібно дуже ефективно взаємодіяти з постійно мінливими даними (наприклад, 3d-позиціями моделей у світі)
Пару років тому я натрапив на "IMGUI", який в основному нагадує режим негайної графіки, але для користувальницьких інтерфейсів. Я не приділяв надто великої уваги, оскільки я все ще працював над розробкою додатків, а сама сцена IMGUI, здавалося, не дуже широка і не успішна. І все-таки підхід, який вони застосовують, здається таким надзвичайно сексуальним та елегантним, що змусив мене написати щось для наступного проекту, використовуючи такий спосіб користувальницького інтерфейсу (я не зміг переконати нікого в роботі: (...)
дозвольте підвести підсумки, що я маю на увазі під "збереженим" та "негайним":
Збережений графічний інтерфейс: На окремому етапі ініціалізації ви створюєте "елементи керування графічним інтерфейсом", такі як Мітки, Кнопки, TextBoxes і т.д. Елементи управління зберігають більшу частину власного стану в пам'яті, наприклад, X, Y, розмір, рамки, дочірні елементи, текст мітки, зображення тощо. Ви можете додавати зворотні дзвінки та слухачів, щоб отримувати інформацію про події та оновлювати дані в управлінському інтерфейсі.
Безпосередній графічний інтерфейс: Бібліотека графічного інтерфейсу складається з функцій "RenderButton", "RenderLabel", "RenderTextBox" ... (редагувати: не плутати RenderButton)префікс. Ці функції також виконують таку логіку, що лежить в основі таких елементів керування, як опитування користувачів, введення символів, обробка швидкості повторення символів, коли користувач утримує клавішу і так далі ...), яку можна зателефонувати, щоб "негайно" зробити керування (не " не потрібно негайно писати в GPU. Зазвичай його запам'ятовується для поточного кадру та сортується на відповідні партії пізніше). Бібліотека не містить жодного "стану" для них. Якщо ви хочете приховати кнопку ... просто не викликайте функцію RenderButton. Усі функції RenderXXX, які мають взаємодію з користувачем, як кнопки або прапорець, мають значення повернення, які вказують, чи користувач натиснув кнопку. Тож ваш "RenderGUI" Функція виглядає як велика функція if / else, де ви викликаєте чи не викликаєте свої функції RenderXXX залежно від стану гри та вся логіка оновлення даних (при натисканні кнопки) переміщується у потік. Усі сховища даних знаходяться "поза" gui та передаються на вимогу функціям Render. (Звичайно, ви б розділили великі функції на кілька, або використали б деякі абстракції класів для групування частин gui. Ми не пишемо код, як у 1980 році, чи не так;))
Тепер я виявив, що Unity3D насправді використовує той самий базовий підхід до своїх вбудованих GUI-систем. Мабуть, є пара GUI з таким підходом і там?
Все-таки .. коли оглядаєтесь, чи здається, що існує сильний ухил до збережених систем GUI? Принаймні, я не знайшов такого підходу, окрім Unity3D, і оригінальна спільнота IMGUI, здається, досить ... .. тиха.
Тож хтось працював з обома ідеями та має якусь сильну думку?
Редагувати: Мене найбільше цікавлять думки, що випливають із реального досвіду. Я думаю, що на форумі IMGUI є багато гострих дискусій щодо будь-якої "теоретичної слабкості" безпосереднього підходу GUI, але мені завжди цікавіше знати про слабкі місця в реальному світі .