使用SDL开发IMGUI(一)

Note:原教程来自http://iki.fi/sol/imgui/

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库变得简单、高速,开发过程对程序员的要求就变高了。保存状态数据有很多种思路,简单的就是Devil全局变量Devil,复杂的UI可能需要KVDB。除此之外IMGUI还有其他缺点,比如在低帧率下表现很难看,自动布局困难,键盘焦点难以确认(UI仅仅是一个图像,不存在内存中的对象)。

本教程使用SDL2开发一个IMGUI库,代码公布在GITHUB(仓库创建中),欢迎star。

IMGUI不仅仅使用在游戏中做UI。unity3D使用IMGUI制作编辑器。当需要设计UI的响应方式时可以打开unity3D实验一下。

FF - 目录

使用SDL开发IMGUI(一)

posted @ 2018-05-04 00:01  jcyongqin  阅读(2951)  评论(0编辑  收藏  举报