Eu tenho trabalhado no desenvolvimento de aplicativos com muitos sistemas GUI "retidos" (abaixo, mais sobre o que quero dizer com isso), como MFC, QT, Forms, SWING e várias estruturas de GUI da Web há alguns anos. Eu sempre achei os conceitos da maioria dos sistemas GUI excessivamente complicados e desajeitados. A quantidade de eventos de retorno de chamada, ouvintes, cópias de dados, algo a ser entendido - conversões (e assim por diante) sempre foram uma fonte de erros e dores de cabeça em comparação com outras partes do aplicativo. (Mesmo com o uso "adequado" de modelos / associações de dados).
Agora estou escrevendo jogos de computador :). Eu trabalhei com uma GUI até agora: Miyagi (não conhecida, mas basicamente a mesma ideia que todos os outros sistemas).
Foi horrível.
Para ambientes de renderização em tempo real como Games, sinto que os sistemas GUI "retidos" são ainda mais obsoletos. As interfaces do usuário geralmente não precisam ter layout automático ou ter janelas redimensionáveis dinamicamente. Em vez disso, eles precisam interagir de maneira muito eficiente com dados sempre em mudança (como posições 3D de modelos no mundo)
Há alguns anos, deparei-me com "IMGUI", que é basicamente como um modo de gráficos imediatos, mas para interfaces de usuário. Não dei muita atenção, pois ainda estava no desenvolvimento de aplicativos e o próprio cenário da IMGUI parecia não ser muito amplo nem bem-sucedido. Ainda assim, a abordagem adotada parece ser tão sexy e elegante que me fez querer escrever algo para o próximo projeto usando esse modo de interface do usuário (não consegui convencer ninguém no trabalho: (...)
deixe-me resumir o que quero dizer com "retido" e "imediato":
GUI Retida: Em uma fase de inicialização separada, você cria "controles da GUI", como Rótulos, Botões, Caixas de Texto, etc., e usa alguma maneira descritiva (ou programática) de colocá-los na tela - tudo antes de qualquer coisa ser renderizada. Os controles mantêm a maior parte de seu próprio estado na memória, como localização X, Y, tamanho, bordas, controles filho, texto da etiqueta, imagens e assim por diante. Você pode adicionar retornos de chamada e ouvintes para se informar sobre eventos e atualizar dados no controle da GUI.
GUI imediata: A biblioteca da GUI consiste nas funções "RenderButton", "RenderLabel", "RenderTextBox" de uma só vez ... (editar: não se confunda com o Renderprefixo. Essas funções também executam a lógica por trás dos controles, como pesquisar entradas do usuário, inserir caracteres, manipular a velocidade de repetição de caracteres quando o usuário mantém pressionada uma tecla e assim por diante ...) que você pode chamar para renderizar "imediatamente" um controle (não tem que ser imediatamente gravado na GPU. Geralmente é lembrado para o quadro atual e classificado em lotes apropriados posteriormente). A biblioteca não possui nenhum "estado" para eles. Se você deseja ocultar um botão ... simplesmente não chame a função RenderButton. Todas as funções do RenderXXX que possuem interação do usuário como botões ou caixa de seleção têm valores retornados que indicam se, por exemplo, o usuário clicou no botão. Então o seu "RenderGUI" A função se parece com uma grande função if / else, na qual você chama ou não as funções RenderXXX, dependendo do estado do jogo e toda a lógica de atualização de dados (quando um botão é pressionado) é entrelaçada no fluxo. Todo o armazenamento de dados está "fora" da GUI e passado sob demanda para as funções Renderizar. (Obviamente, você dividiria as grandes funções em várias ou utilizaria algumas abstrações de classe para agrupar partes da GUI. Nós não escrevemos código como em 1980, não é?
Agora eu descobri que o Unity3D realmente usa a mesma abordagem básica para seus sistemas GUI embutidos. Provavelmente existem algumas GUIs com essa abordagem também?
Ainda .. ao olhar em volta, parece haver um forte viés em relação aos sistemas GUI retidos? Pelo menos eu não encontrei essa abordagem, exceto no Unity3D, e a comunidade IMGUI original parece bastante ... silenciosa.
Então, alguém trabalhou com as duas idéias e tem uma opinião forte?
Edit: Estou mais interessado em opiniões que resultam da experiência do mundo real. Eu acho que há muitas discussões acaloradas no fórum IMGUI sobre qualquer "fraqueza teórica" da abordagem imediata da GUI, mas sempre acho mais esclarecedor saber sobre as fraquezas do mundo real .