Note:原教程来自http://iki.fi/sol/imgui/html
00 – 介绍
IMGUI全称:Immediate Mode GUI。IMGUI不一样于咱们常见的RMGUI(MFC、QT、WPF、GTK都是RMGUI)。在典型的RMGUI的应用程序中,咱们建立了一堆小部件(widgets),它们经过布局显示在窗口上,咱们能够查询小部件的状态,接受系统发来消息和数据,处理、生成新的状态,最终重绘小部件,用户看到改变。程序员
在RMGUI中,代码至少分红3部分:建立、响应消息、删除。若是考虑到多个小部件之间须要传递消息,在系统运行时咱们难以预测消息的传播、小部件状态的改变。虽然RMGUI这么麻烦,但在常规的应用开发中,依然是中流砥柱。可是在游戏开发中,用户与应用的交互十分频繁,游戏逐帧更新,复杂的RMGUI难以作到60FPS。在这种状况下IMGUI就能够展现它的威力。编程
在IMGUI中代码是这个样子的。编辑器
if (button(GEN_ID, 15, 15)) { button_was_pressed(); }
这段代码的奇妙之处在于每一帧都被执行一次,button();函数在屏幕的(15,15)处绘制一个按钮图片,当检测到鼠标刚好“激活”时返回true。这里使用激活是由于这段代码在一秒内会执行60次甚至更多,假如仅仅是按下鼠标就能激活按钮的话,将会在一秒内产生不少次按钮按下响应,这不是咱们但愿看到的。一般是鼠标在按钮内部按下又弹起做为一次激活。当即模式GUI不保存状态,这句话的意思是若是一个小部件须要一些数据显示它的状态,这些数据不保存在小部件内部,而是从外部传递给小部件,因此一般一个小部件能够看做一个函数,而不是一个类。虽然小部件不保存他本身状态,可是状态并无消失,并且须要编程人员主动处理状态,GUI库变得简单、高速,开发过程对程序员的要求就变高了。保存状态数据有不少种思路,简单的就是全局变量
,复杂的UI可能须要KVDB。除此以外IMGUI还有其余缺点,好比在低帧率下表现很难看,自动布局困难,键盘焦点难以确认(UI仅仅是一个图像,不存在内存中的对象)。函数
本教程使用SDL2开发一个IMGUI库,代码公布在GITHUB(仓库建立中),欢迎star。布局
IMGUI不单单使用在游戏中作UI。unity3D使用IMGUI制做编辑器。当须要设计UI的响应方式时能够打开unity3D实验一下。ui