Ich habe vor einigen Jahren an der Anwendungsentwicklung mit vielen "beibehaltenen" GUI-Systemen gearbeitet (siehe unten), wie MFC, QT, Forms, SWING und verschiedenen Web-GUI-Frameworks. Ich fand die Konzepte der meisten GUI-Systeme immer zu kompliziert und umständlich. Die Anzahl der Rückrufereignisse, Listener, Datenkopien und die Anzahl der Zeichenfolgen - Konvertierungen (und so weiter) verursachten im Vergleich zu anderen Teilen der Anwendung immer Fehler und Kopfschmerzen. (Auch bei "ordnungsgemäßer" Verwendung von Datenbindungen / Modellen).
Jetzt schreibe ich Computerspiele :). Bisher habe ich mit einer GUI gearbeitet: Miyagi (nicht bekannt, aber im Grunde die gleiche Idee wie alle anderen Systeme.)
Es war schrecklich.
In Echtzeit-Rendering-Umgebungen wie Games habe ich das Gefühl, dass "beibehaltene" GUI-Systeme noch veralteter sind. Benutzeroberflächen müssen in der Regel nicht automatisch gestaltet werden oder die Größe der Fenster muss während des Betriebs geändert werden. Stattdessen müssen sie sehr effizient mit sich ständig ändernden Daten interagieren (wie 3D-Positionen von Modellen in der Welt).
Vor ein paar Jahren bin ich auf "IMGUI" gestoßen, das im Grunde wie ein Sofortgrafikmodus ist, aber für Benutzeroberflächen. Ich habe nicht zu viel Aufmerksamkeit geschenkt, da ich mich noch in der Anwendungsentwicklung befand und die IMGUI-Szene selbst weder wirklich breit noch erfolgreich wirkte. Trotzdem scheint die Herangehensweise so sexy und elegant zu sein, dass ich auf diese Weise etwas für das nächste Projekt schreiben wollte (ich konnte niemanden bei der Arbeit überzeugen: (...)
Lassen Sie mich zusammenfassen, was ich unter "beibehalten" und "unmittelbar" verstehe:
Beibehaltene GUI: In einer separaten Initialisierungsphase erstellen Sie "GUI-Steuerelemente" wie Beschriftungen, Schaltflächen, Textfelder usw. und verwenden eine beschreibende (oder programmatische) Methode, um sie auf dem Bildschirm zu platzieren - alles bevor etwas gerendert wird. Steuerelemente behalten den größten Teil ihres eigenen Status im Speicher, z. B. X-, Y-Position, Größe, Rahmen, untergeordnete Steuerelemente, Beschriftungstext, Bilder usw. Sie können Rückrufe und Listener hinzufügen, um über Ereignisse informiert zu werden und Daten im GUI-Steuerelement zu aktualisieren.
Sofortige GUI: Die GUI - Bibliothek besteht aus One-Shot "RenderButton", "render", "RenderTextBox" ... Funktionen (edit: Sie erhalten durch die nicht zu verwechseln RenderPräfix. Diese Funktionen führen auch die Logik hinter den Steuerelementen aus, z. B. das Abfragen von Benutzereingaben, das Einfügen von Zeichen, die Geschwindigkeit der Zeichenwiederholung, wenn der Benutzer eine Taste gedrückt hält usw.), die Sie aufrufen können, um ein Steuerelement "sofort" zu rendern (doesn ' Es muss nicht sofort auf die GPU geschrieben werden (normalerweise wird es für den aktuellen Frame gespeichert und später in entsprechende Stapel sortiert). Die Bibliothek hält für diese keinen "Zustand". Wenn Sie eine Schaltfläche ausblenden möchten, rufen Sie einfach nicht die RenderButton-Funktion auf. Alle RenderXXX-Funktionen mit Benutzerinteraktion wie Schaltflächen oder Kontrollkästchen haben Rückgabewerte, die angeben, ob z. B. der Benutzer auf die Schaltfläche geklickt hat. Also dein "RenderGUI" Die Funktion sieht aus wie eine große if / else-Funktion, bei der Sie Ihre RenderXXX-Funktionen aufrufen oder nicht, abhängig von Ihrem Spielstatus, und die gesamte Datenaktualisierungslogik (wenn eine Taste gedrückt wird) ist in den Ablauf eingebunden. Der gesamte Datenspeicher befindet sich "außerhalb" der Benutzeroberfläche und wird bei Bedarf an die Renderfunktionen übergeben. (Natürlich würden Sie die großen Funktionen in mehrere Funktionen aufteilen oder einige Klassenabstraktionen verwenden, um Teile der GUI zu gruppieren. Wir schreiben keinen Code mehr wie 1980, oder?;))
Jetzt stellte ich fest, dass Unity3D für seine integrierten GUI-Systeme den gleichen grundlegenden Ansatz verwendet. Gibt es wahrscheinlich auch ein paar GUIs mit diesem Ansatz?
Dennoch ... scheint es beim Umsehen eine starke Neigung zu beibehaltenen GUI-Systemen zu geben? Zumindest habe ich diesen Ansatz nur in Unity3D gefunden und die ursprüngliche IMGUI-Community scheint eher ... leise zu sein.
Hat also jemand mit beiden Ideen gearbeitet und eine starke Meinung?
Bearbeiten: Ich bin am meisten an Meinungen interessiert, die aus der Praxis stammen. Ich denke, es gibt im IMGUI-Forum viele heftige Diskussionen über jede "theoretische Schwäche" des unmittelbaren GUI-Ansatzes, aber ich finde es immer aufschlussreicher, über Schwächen der realen Welt Bescheid zu wissen .