J'ai travaillé sur le développement d'applications avec beaucoup de systèmes d'interface graphique "conservés" (comme ci-dessous), tels que MFC, QT, Forms, SWING et plusieurs cadres Web-GUI il y a quelques années. J'ai toujours trouvé les concepts de la plupart des systèmes d'interface graphique trop compliqués et maladroits. La quantité d’événements de rappel, d’écouteurs, de copies de données, d’un élément à l’autre - les conversions (et ainsi de suite) étaient toujours une source d’erreurs et de maux de tête par rapport aux autres éléments de l’application. (Même avec une utilisation "correcte" des liaisons / modèles de données).
Maintenant, j'écris des jeux informatiques :). Jusqu'à présent, j'ai travaillé avec une interface graphique: Miyagi (peu connue, mais fondamentalement la même idée que tous les autres systèmes.)
C'était horrible.
Pour les environnements de rendu en temps réel tels que les jeux, j'ai l'impression que les systèmes d'interface graphique "conservés" sont encore plus obsolètes. Les interfaces utilisateur n'ont généralement pas besoin d'être automatiquement mises en page ou d'avoir des fenêtres redimensionnables à la volée. Au lieu de cela, ils doivent interagir très efficacement avec des données en constante évolution (comme les positions 3d des modèles dans le monde).
Il y a quelques années, je suis tombé sur "IMGUI", qui est fondamentalement un mode graphique immédiat, mais pour les interfaces utilisateur. Je n'ai pas fait trop attention, étant toujours en développement d'applications et la scène IMGUI elle-même ne semblait pas vraiment large ni réussie. Malgré tout, leur approche semble être tellement sexy et élégante, que cela m'a donné envie d'écrire quelque chose pour le prochain projet en utilisant cette interface utilisateur (j'ai échoué à convaincre quiconque au travail: (...)
Permettez-moi de résumer ce que je veux dire par "retenu" et "immédiat":
Interface graphique conservée: dans une phase d'initialisation distincte, vous créez des "commandes d'interface graphique" telles que des étiquettes, des boutons, des zones de texte, etc. Les contrôles conservent la plupart de leurs propres états en mémoire, tels que l'emplacement X, l'emplacement Y, la taille, les bordures, les contrôles enfants, le texte de l'étiquette, les images, etc. Vous pouvez ajouter des rappels et des écouteurs pour être informé des événements et mettre à jour les données dans le contrôle de l'interface graphique.
Interface graphique immédiate: La bibliothèque d’interface graphique se compose de fonctions uniques "RenderButton", "RenderLabel", "RenderTextBox" ... (modifier: ne vous laissez pas troubler par le rendu.préfixe. Ces fonctions font également la logique derrière les contrôles, comme interroger l'utilisateur, interroger, insérer des caractères, gérer la vitesse de répétition des caractères lorsque l'utilisateur appuie sur une touche, etc.) que vous pouvez appeler pour rendre "immédiatement" le rendu d'un contrôle Il n'est pas nécessaire d'écrire immédiatement sur le GPU (en général, il est mémorisé pour l'image en cours et trié par la suite en lots appropriés). La bibliothèque ne détient aucun "état" pour ceux-ci. Si vous souhaitez masquer un bouton ... N'appelez pas la fonction RenderButton. Toutes les fonctions de RenderXXX qui ont une interaction utilisateur comme un bouton ou une case à cocher ont des valeurs de retour indiquant par exemple si l'utilisateur a cliqué sur le bouton. Donc, votre "RenderGUI" fonction ressemble à une grosse fonction if / else où vous appelez ou n’appelez pas vos fonctions RenderXXX en fonction de votre état de jeu et de toute la logique de mise à jour des données (lorsqu’un bouton est enfoncé) est mêlée au flux. Tout le stockage de données est "en dehors" de l'interface graphique et transmis à la demande aux fonctions de rendu. (Bien sûr, vous diviseriez les grandes fonctions en plusieurs fonctions ou utiliseriez des abstractions de classe pour regrouper des parties de l'interface graphique. Nous n'écrivons plus de code comme en 1980, n'est-ce pas?;))
Maintenant, j'ai découvert qu'Unity3D utilise la même approche de base pour ses systèmes d'interface graphique intégrés. Il y a probablement quelques interfaces graphiques avec cette approche également?
Pourtant… quand on regarde autour de soi, il semble y avoir un fort parti pris pour les systèmes d’interface graphique conservés? Au moins, je n'ai pas trouvé cette approche, sauf dans Unity3D, et la communauté IMGUI d'origine semble être plutôt… .. silencieuse.
Donc, quiconque a travaillé avec les deux idées et a une opinion forte?
Edit: Je suis plus intéressé par les opinions qui découlent d'une expérience réelle. Je pense qu'il y a beaucoup de discussions animées dans le forum IMGUI sur toute "faiblesse théorique" de l'approche d'interface graphique immédiate, mais je trouve toujours plus instructif de connaître les faiblesses du monde réel .