几年前,我一直在使用许多“保留的” GUI系统(以下是我的意思)进行应用程序开发,例如MFC,QT,Forms,SWING和多个Web-GUI框架。我总是发现大多数GUI系统的概念过于复杂和笨拙。与应用程序中的其他部分相比,大量的回调事件,侦听器,数据副本,从字符串到字符串的内容-转换(等等)始终是错误和头痛的来源。(即使“正确”使用了数据绑定/模型)。
现在我正在写电脑游戏:)。到目前为止,我使用的是一个GUI:Miyagi(不知名,但与所有其他系统基本相同的Idea。)
那太差了。
对于像游戏这样的实时渲染环境,我觉得“保留的” GUI系统已经过时了。用户界面通常不需要自动布局或动态调整窗口大小。相反,他们需要与不断变化的数据进行非常有效的交互(例如世界上模型的3D位置)
几年前,我偶然发现了“ IMGUI”,它基本上类似于即时图形模式,但是用于用户界面。我没有太在意,因为我仍在进行应用程序开发,而IMGUI本身似乎并不广泛也不成功。仍然,他们采用的方法似乎是如此性感和优雅,以至于让我想使用这种UI方式为下一个项目编写一些东西(我未能说服工作中的任何人:(...)
让我总结一下“保留”和“立即”的意思:
保留的GUI:在一个单独的初始化阶段,您将创建“ GUI控件”(如Labels,Buttons,TextBoxes等),并使用某种描述性(或编程性)方式将它们放置在屏幕上-始终在呈现任何内容之前。控件在内存中拥有大多数状态,例如X,Y位置,大小,边框,子控件,标签文本,图像等。您可以添加回调和侦听器,以了解事件并更新GUI控件中的数据。
即时GUI:GUI库由一次性“ RenderButton”,“ RenderLabel”,“ RenderTextBox” ...功能组成(编辑:不要被Render弄糊涂字首。这些功能还可以执行控件背后的逻辑,例如轮询用户输入,插入字符,在用户按住键时处理字符重复速度等...),您可以调用它们以“立即”呈现控件(doesn'不必立即将其写入GPU。通常会记住当前帧的GPU,并在以后将其分类。这些库不包含任何“状态”。如果要隐藏按钮...,请不要调用RenderButton函数。所有具有用户交互作用的RenderXXX函数(如按钮或复选框)都具有返回值,这些返回值指示例如用户是否单击了按钮。所以你的“ RenderGUI” 函数看起来像一个很大的if / else函数,您可以在其中调用或不调用RenderXXX函数,具体取决于游戏状态,并且所有数据更新逻辑(当按下按钮时)都将插入到流程中。所有数据存储都在gui的“外部”,并按需传递给Render函数。(当然,您可以将大功能分成几个功能,或使用一些类抽象来对gui的各个部分进行分组。我们不再像1980年那样编写代码了,对吗?))
现在,我发现Unity3D实际上对其内置GUI系统使用了完全相同的基本方法。也可能有两种使用这种方法的GUI?
仍然..环顾四周时,似乎对保留的GUI系统有强烈的偏见?至少我没有在Unity3D中找到这种方法,并且原始的IMGUI社区似乎相当安静。
因此,有人同时使用这两种想法并有强烈的见解?
编辑:我对来自现实经验的观点最感兴趣。我认为IMGUI论坛中有很多关于直接GUI方法的“理论缺陷”的热烈讨论,但是我总是发现了解现实中的缺陷会更具有启发性。