Zum Inhalt springen

„Immediate Mode GUI“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Kat.
K Sprache
 
Zeile 2: Zeile 2:


'''Immediate Mode GUI''' (wörtlich übersetzt: „Unmittelbar-Modus GUI“) ist eine Art der [[Implementierung]] von [[Grafische Benutzeroberfläche|grafischen Benutzeroberflächen]] (GUIs), die das [[Immediate Mode (Computergrafik)|Immediate-Mode]]-Entwurfsmuster für die Gestaltung der [[Programmierschnittstelle]] (API) in [[Grafikbibliothek]]en verwendet – wobei '''unmittelbar''' bedeutet, dass
'''Immediate Mode GUI''' (wörtlich übersetzt: „Unmittelbar-Modus GUI“) ist eine Art der [[Implementierung]] von [[Grafische Benutzeroberfläche|grafischen Benutzeroberflächen]] (GUIs), die das [[Immediate Mode (Computergrafik)|Immediate-Mode]]-Entwurfsmuster für die Gestaltung der [[Programmierschnittstelle]] (API) in [[Grafikbibliothek]]en verwendet – wobei '''unmittelbar''' bedeutet, dass
* der [[Client]] alle [[Steuerelement]]e (visueller Baum/logischer Baum von Steuerelementen) selbst verwaltet und die Grafikobjekte zusammensetzt, um die Steuerelemente der kompletten GUI zu [[Bildsynthese|rendern]] , oder
* der [[Client]] alle [[Steuerelement]]e (visueller Baum/logischer Baum von Steuerelementen) selbst verwaltet und die Grafikobjekte zusammensetzt, um die Steuerelemente der kompletten GUI zu [[Bildsynthese|rendern]], oder
* der Client die [[Grafisches Primitiv|grafischen Primitive]] Bild für [[Einzelbild (Film)|Bild]] direkt in eine [[Grafikpipeline]] zum Rendern einfügt
* der Client die [[Grafisches Primitiv|grafischen Primitive]] Bild für [[Einzelbild (Film)|Bild]] direkt in eine [[Grafikpipeline]] zum Rendern einfügt
ohne Nutzung – also'' '''unmittelbar''' ''- umfangreicher Umleitungen auf gespeicherte Ressourcen und wo
ohne Nutzung – also'' '''unmittelbar''' ''- umfangreicher Umleitungen auf gespeicherte Ressourcen und wo
* die [[Ereignis (Programmierung)|Ereignisverarbeitung]] direkt durch den Client gesteuert und vollständig von ihm implementiert wird (im Gegensatz zu einer gebrauchsfertigen Basis-Ereignisverarbeitung durch ein GUI-System/eine GUI-Bibliothek unter Verwendung vordefinierter Ereignisse/[[Rückruffunktion]]en oder Signale/Slots) und
* die [[Ereignis (Programmierung)|Ereignisverarbeitung]] direkt durch den Client gesteuert und vollständig von ihm implementiert wird (im Gegensatz zu einer gebrauchsfertigen Basis-Ereignisverarbeitung durch ein GUI-System/eine GUI-Bibliothek unter Verwendung vordefinierter Ereignisse/[[Rückruffunktion]]en oder Signale/Slots) und
* die Listen der zu rendernden grafischen Objekte vom Client verwaltet werden und alle Zeichenbefehle, die zur Beschreibung der gesamten GUI benötigt werden jedes Mal, wenn ein neues Bild benötigt wird, erneut an die Grafikpipeline übergeben werden müssen.
* die Listen der zu rendernden grafischen Objekte vom Client verwaltet werden und alle Zeichenbefehle, die zur Beschreibung der gesamten GUI benötigt werden, jedes Mal, wenn ein neues Bild benötigt wird, erneut an die Grafikpipeline übergeben werden müssen.


[[Datei:Retail-mode-graphics-api.png|mini|Schematische Erläuterung des Modus mit gespeicherten Ressourcen eines Grafik-API im Unterschied]]
[[Datei:Retail-mode-graphics-api.png|mini|Schematische Erläuterung des Modus mit gespeicherten Ressourcen eines Grafik-API im Unterschied]]
Zeile 33: Zeile 33:
* weniger komplex strukturiert und leichter zu verstehen ist (im Sinne von weniger impliziten Annahmen pro GUI-Toolkit-API-Aufruf) – dies führt in der Regel aber auch zu weniger Funktionalität,
* weniger komplex strukturiert und leichter zu verstehen ist (im Sinne von weniger impliziten Annahmen pro GUI-Toolkit-API-Aufruf) – dies führt in der Regel aber auch zu weniger Funktionalität,
* für ''mehr als einen einfachen'' Baum von Steuerelementen einschließlich Layout (absolute und/oder relative Positionierung in Bezug auf Eltern oder Geschwister) aufwendiger (benötigt typischerweise mehr GUI-Toolkit-API-Aufrufe) zu erstellen und zu verwalten ist,
* für ''mehr als einen einfachen'' Baum von Steuerelementen einschließlich Layout (absolute und/oder relative Positionierung in Bezug auf Eltern oder Geschwister) aufwendiger (benötigt typischerweise mehr GUI-Toolkit-API-Aufrufe) zu erstellen und zu verwalten ist,
* eine weniger ausgefeilte Entfernung verdeckter Objekte ([[Z-Buffer|Z-Buffering]]), [[Trefferprüfung]], Behandlung von Zustandsänderungen, [[Bildlauf]]funktion und Animation für den [[Aktives Fenster|Fokus]]/das [[Aktives Fenster#Aktives Widget innerhalb von Fenstern|aktives Steuerelement]] hat – dies impliziert auch die Notwendigkeit, selbst einen logischen Baums/visuellen Baums von Steuerelementen zu verwalten,
* eine weniger ausgefeilte Entfernung verdeckter Objekte ([[Z-Buffer|Z-Buffering]]), [[Trefferprüfung]], Behandlung von Zustandsänderungen, [[Bildlauf]]funktion und Animation für den [[Aktives Fenster|Fokus]]/das [[Aktives Fenster#Aktives Widget innerhalb von Fenstern|aktives Steuerelement]] hat – dies impliziert auch die Notwendigkeit, selbst einen logischen Baum/visuellen Baum von Steuerelementen zu verwalten,
* die [[Vertex Buffer Object|Vertexpuffer]] für jedes neue [[Einzelbild (Film)|Bild]] komplett von Grund auf neu aufbauen muss, und folglich
* die [[Vertex Buffer Object|Vertexpuffer]] für jedes neue [[Einzelbild (Film)|Bild]] komplett von Grund auf neu aufbauen muss, und folglich
* eine ständige Arbeitsbelastung für den [[Prozessor]] (CPU) erzeugt.
* eine ständige Arbeitsbelastung für den [[Prozessor]] (CPU) erzeugt.


Deshalb sind Immediate-Mode-GUI-Toolkits eine gute Wahl für alle, die ein einfaches aber leicht veränderbares und erweiterbares GUI-Toolkit wünschen. Sie sind in der Regel generisch, quelloffen und plattformübergreifend. Eine Möglichkeit, die Flexibilität und Kombinierbarkeit eines [[Immediate Mode (Computergrafik)|Immediate Mode]] GUI ohne die Nachteile der Verwaltung des [[Steuerelement]]-Baumes ''nur'' in Funktionsaufrufen mit dem Mangel an direkter Kontrolle, wie die grafische Benutzeroberfläche in der [[Bildsynthese|Render]] Engine gezeichnet wird, zu haben, wäre die Verwendung eines virtuellen Steuerelement-Baumes – so wie [[React]] einen virtuellen [[Document Object Model|DOM]] verwendet.
Deshalb sind Immediate-Mode-GUI-Toolkits eine gute Wahl für alle, die ein einfaches, aber leicht veränderbares und erweiterbares GUI-Toolkit wünschen. Sie sind in der Regel generisch, quelloffen und plattformübergreifend. Eine Möglichkeit, die Flexibilität und Kombinierbarkeit eines [[Immediate Mode (Computergrafik)|Immediate Mode]] GUI ohne die Nachteile der Verwaltung des [[Steuerelement]]-Baumes ''nur'' in Funktionsaufrufen mit dem Mangel an direkter Kontrolle, wie die grafische Benutzeroberfläche in der [[Bildsynthese|Render]] Engine gezeichnet wird, zu haben, wäre die Verwendung eines virtuellen Steuerelement-Baumes – so wie [[React]] einen virtuellen [[Document Object Model|DOM]] verwendet.


== Implementierungen ==
== Implementierungen ==


Das ursprüngliche ''Immediate Mode GUI'' Toolkit ist ''imgui'' by Adrien Herubel<ref>{{cite web|first=Adrien|last=Herubel|url=https://github.com/AdrienHerubel/imgui|title=AdrienHerubel/imgui: A small multiplatform immediate mode graphical user interface with OpenGL3.2 backend|date=2019-12-18}}</ref>, das auf [[OpenGL]] basiert. Die Idee wurde von Casey Muratori verbreitet. Es existieren weitere Toolkits wie
Das ursprüngliche ''Immediate Mode GUI'' Toolkit ist ''imgui'' by Adrien Herubel<ref>{{cite web|first=Adrien|last=Herubel|url=https://github.com/AdrienHerubel/imgui|title=AdrienHerubel/imgui: A small multiplatform immediate mode graphical user interface with OpenGL3.2 backend|date=2019-12-18}}</ref>, das auf [[OpenGL]] basiert. Die Idee wurde von Casey Muratori verbreitet. Es existieren weitere Toolkits wie
* nuklear<ref>{{cite web|first=Micha|last=Mettke|url=https://github.com/vurtun/nuklear|title=vurtun/nuklear: A single-header ANSI C gui library|date=2019-12-22}}</ref>, das auf verschiedenen [[Grafikbibliothek]]en ([[Direct3D]], [[GLFW]], [[OpenGL]], [[Simple DirectMedia Layer|SDL]], [[Simple and Fast Multimedia Library|SFML]], [[Wayland (Display-Server-Protokoll)|Wayland]], Windows [[Graphics Device Interface|GDI]], Window [[Graphics Device Interface|GDI+]] and [[X11]]) aufsetzen kann,
* nuklear<ref>{{cite web|first=Micha|last=Mettke|url=https://github.com/vurtun/nuklear|title=vurtun/nuklear: A single-header ANSI C gui library|date=2019-12-22}}</ref>, das auf verschiedenen [[Grafikbibliothek]]en ([[Direct3D]], [[GLFW]], [[OpenGL]], [[Simple DirectMedia Layer|SDL]], [[Simple and Fast Multimedia Library|SFML]], [[Wayland (Display-Server-Protokoll)|Wayland]], Windows [[Graphics Device Interface|GDI]], Windows [[Graphics Device Interface|GDI+]] und [[X11]]) aufsetzen kann,
* kiss_sdl<ref>{{cite web|first=Tarvo|last=Korrovits|url=https://github.com/actsl/kiss_sdl|title=actsl/kiss_sdl: Simple generic GUI widget toolkit for SDL2|date=2019-12-19}}</ref> für [[Simple DirectMedia Layer|SDL]] (Simple DirectMedia Layer),
* kiss_sdl<ref>{{cite web|first=Tarvo|last=Korrovits|url=https://github.com/actsl/kiss_sdl|title=actsl/kiss_sdl: Simple generic GUI widget toolkit for SDL2|date=2019-12-19}}</ref> für [[Simple DirectMedia Layer|SDL]] (Simple DirectMedia Layer),
* Gio<ref>{{Cite web|url=https://gioui.org/|title=Gio - immediate mode GUI in Go|website=gioui.org|accessdate=2019-11-14}}</ref> für [[Go (Programmiersprache)|Go]] oder
* Gio<ref>{{Cite web|url=https://gioui.org/|title=Gio - immediate mode GUI in Go|website=gioui.org|accessdate=2019-11-14}}</ref> für [[Go (Programmiersprache)|Go]] oder
* [[Dear ImGui]]<ref>{{cite web|first=Omar|last=Cornut|url=https://github.com/ocornut/imgui|title=ocornut/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies|date=2019-12-22}}</ref>, das in C++ geschrieben ist, auf verschiedenen [[Grafikbibliothek]]en ([[Allegro-Bibliothek|Allegro 5]] , [[DirectX]], [[GLFW]], [[iOS (Betriebssystem)|iOS]], [[Marmalade (Software)|Marmalade]], [[Metal (API)|Metal]], [[OpenGL]], [[Simple DirectMedia Layer|SDL 2]] and [[Vulkan (API)|Vulkan]]) aufsetzen kann und für das es
* [[Dear ImGui]]<ref>{{cite web|first=Omar|last=Cornut|url=https://github.com/ocornut/imgui|title=ocornut/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies|date=2019-12-22}}</ref>, das in C++ geschrieben ist, auf verschiedenen [[Grafikbibliothek]]en ([[Allegro-Bibliothek|Allegro 5]], [[DirectX]], [[GLFW]], [[iOS (Betriebssystem)|iOS]], [[Marmalade (Software)|Marmalade]], [[Metal (API)|Metal]], [[OpenGL]], [[Simple DirectMedia Layer|SDL 2]] und [[Vulkan (API)|Vulkan]]) aufsetzen kann und für das es
** Projekte für zusätzliche Unterstützung von weiteren [[Grafikbibliothek]]en ([[Android (Betriebssystem)|Android]], [[Irrlicht Engine]], [[OGRE]], [[SFML]] …),
** Projekte für zusätzliche Unterstützung von weiteren [[Grafikbibliothek]]en ([[Android (Betriebssystem)|Android]], [[Irrlicht Engine]], [[OGRE]], [[SFML]] …),
** Projekte für zusätzliche Sprachbindungen ([[C-Sharp|C#]]/.Net, [[D (Programmiersprache)|D]], [[Go (Programmiersprache)|Go]], [[Haskell (Programmiersprache)|Haskell]], [[Java (Programmiersprache)|Java]] …) und
** Projekte für zusätzliche Sprachbindungen ([[C-Sharp|C#]]/.Net, [[D (Programmiersprache)|D]], [[Go (Programmiersprache)|Go]], [[Haskell (Programmiersprache)|Haskell]], [[Java (Programmiersprache)|Java]] …) und
** Portierungen in andere Sprachen gibt (hier die jvm Portierung<ref>{{cite web|author=kotlin-graphics|url=https://github.com/kotlin-graphics/imgui|title=kotlin-graphics/imgui: Bloat-free Immediate Mode Graphical User interface for JVM with minimal dependencies (rewrite of dear imgui)|date=2019-12-19}}</ref>).
** Portierungen in andere Sprachen gibt (hier die JVM-Portierung<ref>{{cite web|author=kotlin-graphics|url=https://github.com/kotlin-graphics/imgui|title=kotlin-graphics/imgui: Bloat-free Immediate Mode Graphical User interface for JVM with minimal dependencies (rewrite of dear imgui)|date=2019-12-19}}</ref>).


== Siehe auch ==
== Siehe auch ==

Aktuelle Version vom 5. Mai 2024, 21:41 Uhr

Schematische Erläuterung des Unmittelbar-Modus eines Grafik-API

Immediate Mode GUI (wörtlich übersetzt: „Unmittelbar-Modus GUI“) ist eine Art der Implementierung von grafischen Benutzeroberflächen (GUIs), die das Immediate-Mode-Entwurfsmuster für die Gestaltung der Programmierschnittstelle (API) in Grafikbibliotheken verwendet – wobei unmittelbar bedeutet, dass

ohne Nutzung – also unmittelbar - umfangreicher Umleitungen auf gespeicherte Ressourcen und wo

  • die Ereignisverarbeitung direkt durch den Client gesteuert und vollständig von ihm implementiert wird (im Gegensatz zu einer gebrauchsfertigen Basis-Ereignisverarbeitung durch ein GUI-System/eine GUI-Bibliothek unter Verwendung vordefinierter Ereignisse/Rückruffunktionen oder Signale/Slots) und
  • die Listen der zu rendernden grafischen Objekte vom Client verwaltet werden und alle Zeichenbefehle, die zur Beschreibung der gesamten GUI benötigt werden, jedes Mal, wenn ein neues Bild benötigt wird, erneut an die Grafikpipeline übergeben werden müssen.
Schematische Erläuterung des Modus mit gespeicherten Ressourcen eines Grafik-API im Unterschied

Dies impliziert, dass der Client-Code in einem Immediate Mode GUI seine eigenen grafischen Primitive verwaltet und dieses API-Design auch die Implementierung der Grafikpipeline beeinflusst.

Es gibt ein weiteres bedeutendes Entwurfsmuster der Programmierschnittstelle in Grafikbibliotheken – den Retained Mode.[1] Im Retained Mode werden die grafischen Primitive durch das GUI-System/die GUI-Bibliothek verwaltet, oft vor dem Client-Code versteckt.

Die meisten GUI-Toolkits für den Immediate Mode sind Weiterentwicklungen aus der Videospielentwicklung und besonders geeignet, wenn

  • ein GUI synchron mit der Spielszene oder einer komplexen Grafik aktualisiert werden muss,
  • ein GUI auf eine Spielszene oder eine komplexe Grafik überlagert werden muss (was in beiden Fällen besonders einfach ist, wenn sowohl das GUI als auch die Spielszene durch die Spielschleife gesteuert werden), oder
  • ein GUI ein ungewöhnliches Aussehen haben oder mit komplexer Grafik aufgepeppt sein soll.

Typisch für ein GUI-Toolkit für den Immediate Mode ist, dass es

  • direkter in dem Sinne ist, dass der Baum von Steuerelementen (Widgets) oft ein Baum aus Funktionsaufrufen ist, der wunderbar zusammensetzbar und flexibel ist – aber mit dem schwer zu interagieren ist,
  • weniger komplex strukturiert und leichter zu verstehen ist (im Sinne von weniger impliziten Annahmen pro GUI-Toolkit-API-Aufruf) – dies führt in der Regel aber auch zu weniger Funktionalität,
  • für mehr als einen einfachen Baum von Steuerelementen einschließlich Layout (absolute und/oder relative Positionierung in Bezug auf Eltern oder Geschwister) aufwendiger (benötigt typischerweise mehr GUI-Toolkit-API-Aufrufe) zu erstellen und zu verwalten ist,
  • eine weniger ausgefeilte Entfernung verdeckter Objekte (Z-Buffering), Trefferprüfung, Behandlung von Zustandsänderungen, Bildlauffunktion und Animation für den Fokus/das aktives Steuerelement hat – dies impliziert auch die Notwendigkeit, selbst einen logischen Baum/visuellen Baum von Steuerelementen zu verwalten,
  • die Vertexpuffer für jedes neue Bild komplett von Grund auf neu aufbauen muss, und folglich
  • eine ständige Arbeitsbelastung für den Prozessor (CPU) erzeugt.

Deshalb sind Immediate-Mode-GUI-Toolkits eine gute Wahl für alle, die ein einfaches, aber leicht veränderbares und erweiterbares GUI-Toolkit wünschen. Sie sind in der Regel generisch, quelloffen und plattformübergreifend. Eine Möglichkeit, die Flexibilität und Kombinierbarkeit eines Immediate Mode GUI ohne die Nachteile der Verwaltung des Steuerelement-Baumes nur in Funktionsaufrufen mit dem Mangel an direkter Kontrolle, wie die grafische Benutzeroberfläche in der Render Engine gezeichnet wird, zu haben, wäre die Verwendung eines virtuellen Steuerelement-Baumes – so wie React einen virtuellen DOM verwendet.

Implementierungen

[Bearbeiten | Quelltext bearbeiten]

Das ursprüngliche Immediate Mode GUI Toolkit ist imgui by Adrien Herubel[2], das auf OpenGL basiert. Die Idee wurde von Casey Muratori verbreitet. Es existieren weitere Toolkits wie

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Quinn Radich: Retained Mode Versus Immediate Mode. In: Win32 apps. Microsoft, 30. Mai 2018, abgerufen am 21. Dezember 2019.
  2. Adrien Herubel: AdrienHerubel/imgui: A small multiplatform immediate mode graphical user interface with OpenGL3.2 backend. 18. Dezember 2019;.
  3. Micha Mettke: vurtun/nuklear: A single-header ANSI C gui library. 22. Dezember 2019;.
  4. Tarvo Korrovits: actsl/kiss_sdl: Simple generic GUI widget toolkit for SDL2. 19. Dezember 2019;.
  5. Gio - immediate mode GUI in Go. In: gioui.org. Abgerufen am 14. November 2019.
  6. Omar Cornut: ocornut/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies. 22. Dezember 2019;.
  7. kotlin-graphics: kotlin-graphics/imgui: Bloat-free Immediate Mode Graphical User interface for JVM with minimal dependencies (rewrite of dear imgui). 19. Dezember 2019;.