使用SDL開發IMGUI(一)

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庫變得簡單、高速,開發過程對程序員的要求就變高了。保存狀態數據有不少種思路,簡單的就是Devil全局變量Devil,複雜的UI可能須要KVDB。除此以外IMGUI還有其餘缺點,好比在低幀率下表現很難看,自動佈局困難,鍵盤焦點難以確認(UI僅僅是一個圖像,不存在內存中的對象)。函數

本教程使用SDL2開發一個IMGUI庫,代碼公佈在GITHUB(倉庫建立中),歡迎star。佈局

IMGUI不單單使用在遊戲中作UI。unity3D使用IMGUI製做編輯器。當須要設計UI的響應方式時能夠打開unity3D實驗一下。ui

FF - 目錄

使用SDL開發IMGUI(一)spa

相關文章
相關標籤/搜索