Ho lavorato allo sviluppo di applicazioni con molti sistemi di GUI "mantenuti" (di seguito maggiori informazioni su ciò che intendo con ciò) come MFC, QT, Forms, SWING e diversi framework Web-GUI alcuni anni fa. Ho sempre trovato i concetti della maggior parte dei sistemi di interfaccia grafica eccessivamente complicati e goffi. La quantità di eventi di callback, ascoltatori, copie di dati, qualcosa da stringere a qualcosa - le conversioni (e così via) sono sempre state una fonte di errori e mal di testa rispetto ad altre parti dell'applicazione. (Anche con un uso "corretto" di Data Binding / Modelli).
Ora sto scrivendo giochi per computer :). Finora ho lavorato con una GUI: Miyagi (non ben nota, ma sostanzialmente la stessa Idea di tutti gli altri sistemi.)
È stato orribile.
Per ambienti di rendering in tempo reale come Games, ho la sensazione che i sistemi di interfaccia grafica "conservati" siano ancora più obsoleti. Le interfacce utente di solito non devono essere auto-layout o avere finestre ridimensionabili al volo. Invece, devono interagire in modo molto efficiente con dati in continua evoluzione (come le posizioni 3d dei modelli nel mondo)
Un paio di anni fa, mi sono imbattuto in "IMGUI" che è sostanzialmente come una modalità grafica immediata, ma per le interfacce utente. Non ho prestato troppa attenzione, dato che ero ancora nello sviluppo di applicazioni e la scena IMGUI stessa sembrava non essere molto ampia o di successo. Tuttavia l'approccio che adottano sembra essere così totalmente sexy ed elegante, che mi ha fatto venire voglia di scrivere qualcosa per il prossimo progetto usando questo modo di interfaccia utente (non sono riuscito a convincere nessuno al lavoro: (...)
vorrei riassumere cosa intendo per "trattenuto" e "immediato":
Interfaccia grafica mantenuta: in una fase di inizializzazione separata, si creano "controlli della GUI" come etichette, pulsanti, caselle di testo ecc. E si utilizza un modo descrittivo (o programmatico) per posizionarli sullo schermo, tutto prima che venga riprodotto qualcosa. I controlli mantengono la maggior parte del proprio stato in memoria come X, posizione Y, dimensioni, bordi, controlli figlio, etichetta testo, immagini e così via. È possibile aggiungere callback e listener per essere informati sugli eventi e aggiornare i dati nel controllo della GUI.
GUI immediata: la libreria GUI è composta dalle funzioni "RenderButton", "RenderLabel", "RenderTextBox" ... (modifica: non confonderti dal Renderprefisso. Queste funzioni eseguono anche la logica dietro i controlli come il polling dell'input dell'utente, l'inserimento di caratteri, la gestione della velocità di ripetizione dei caratteri quando l'utente tiene premuto un tasto e così via ... che è possibile chiamare per eseguire il rendering "immediato" di un controllo (no devono essere immediatamente scritti nella GPU, di solito viene ricordato per il frame corrente e ordinato in lotti appropriati successivamente). La libreria non contiene alcun "stato" per questi. Se vuoi nascondere un pulsante ... non chiamare la funzione RenderButton. Tutte le funzioni di RenderXXX che hanno interazione dell'utente come pulsanti o caselle di controllo hanno valori di ritorno che indicano se l'utente ha fatto clic sul pulsante. Quindi il tuo "RenderGUI" sembra una grande funzione if / else in cui chiamate o meno le vostre funzioni RenderXXX a seconda del vostro stato di gioco e tutta la logica di aggiornamento dei dati (quando si preme un pulsante) viene interrotta nel flusso. Tutta l'archiviazione dei dati è "esterna" alla GUI e passata su richiesta alle funzioni di rendering. (Certo, divideresti le grandi funzioni in diverse funzioni o utilizzeresti alcune astrazioni di classe per raggruppare parti della GUI. Non scriviamo più codice come nel 1980, vero?;))
Ora ho scoperto che Unity3D utilizza effettivamente lo stesso approccio di base ai loro sistemi di GUI integrati. Probabilmente ci sono un paio di GUI con questo approccio anche là fuori?
Tuttavia ... quando ci guardiamo intorno, sembra esserci un forte pregiudizio nei confronti dei sistemi di GUI mantenuti? Almeno non ho trovato questo approccio se non in Unity3D e la comunità originale di IMGUI sembra essere piuttosto .... tranquilla.
Quindi qualcuno ha lavorato con entrambe le idee e ha un'opinione forte?
Modifica: sono più interessato alle opinioni che derivano dall'esperienza del mondo reale. Penso che ci siano molte discussioni accese nel forum IMGUI su qualsiasi "debolezza teorica" dell'approccio immediato alla GUI, ma trovo sempre più illuminante conoscere le debolezze del mondo reale .