青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    從某種意義上來說,做圖形也好,做GUI也好,做編譯器也好,大概都是一種情結。其實只要稍微想一想就知道,能把它們三者有機統一起來的,就只有游戲。我很久以前的確是為了想開發游戲才對編程產生興趣的,而學習游戲開發占據了我前六年的時間。雖然現在不做了,不過偶爾總是會覺得手癢。但是做游戲沒美工做不好怎么辦呢?就只好寫游戲代碼了。但是沒有資源寫出來的游戲又不好玩,于是就只好寫庫。那寫什么庫呢,自然就只有渲染器、界面引擎和腳本引擎了。我的博客的大部分文章也是圍繞著這三件事情建立起來,而且在中間不斷切換的。

    撒,所以今天就輪到GUI了。我一直很想做出一個自繪的GUI出來,無奈一直設計不出一個好的架構。后來嘗試用原生API,但是卻又很不喜歡MFC的設計,就嘗試自己照著.NET Framework和Delphi那套VCL的樣子封裝了一個控件庫出來。無奈原生API細節無敵多,后來沒做把所有的功能都全部做完。因此后來一段時間凡是需要界面我都直接用C#做。然后CEGUI出了,WPF和Silverlight也出了,我發現如今要做一個漂亮的GUI非自繪已經做不到了,所以我又做了一次嘗試。

    去年在美帝的時候曾經試圖再設計一次,得到了一些結果。后來我發現其實根本沒辦法為GDI、DirectX、OpenGL和其它繪圖設備抽象一個公用的接口,否則就會遭遇大量性能問題。因為在很多細節上,譬如說渲染文字,為了達到較高的性能,OpenGL和DirectX需要使用幾乎相反的策略來做。因此這次我又換了一個方法,而且在Vczh Library++ 3.0的Candidate目錄下已經checkin了一個試驗品。

    我把一個自繪的GUI分成了下面若干個層次。
    1、NativeWindow。NativeWindow表示的是一個頂層窗口的實現。譬如說我們想用Windows的窗口作為自繪窗口的頂層窗口(游戲里面的很多頂層窗口是繪制在游戲窗口里面的,所以頂層窗口并不一定是Windows的窗口)。
    2、控件庫。控件庫包含了這個自繪GUI庫的所有預定義控件。控件本身包含對用戶輸入的相應邏輯,但是每一個控件的繪制以及鼠標點中測試不在此范圍內。
    3、控件皮膚接口。每一個最終控件都會擁有一個控件皮膚接口。每當控件的狀態發生了變化,控件會調用皮膚接口更新控件的當前狀態。每當控件需要知道某一個點是否位于一個控件里面的時候,他也會去調用該控件的皮膚獲得結果。因此控件皮膚接口包含了一切關于繪制(因此理所當然也就包含了點中測試)的邏輯。

    為了達到最高的性能,一套皮膚的實現只能綁定在某種繪圖設備上,也就是說缺省狀態下一套為GDI設備設計出來的皮膚是不能直接使用在DirectX設備上面的。當然我這個框架的設計也是足夠開放的,如果你非得用同一套代碼來實現不同繪圖設備上的皮膚,那么你是可以自己動手豐衣足食,做到給GDI和DirectX設計一個公共接口并插入我的GUI框架的(只不過這種做法一般情況下都會慘死)。

    那么如何添加繪圖設備呢?目前NativeWindow有一個基于Windows窗口的實現,并且NativeWindow的接口要求該實現在創建、銷毀、接收到很多窗口事件的時候都調用某一個回調對象。我們可以通過注冊一個全局回調對象或者具體窗口的回調對象來獲得NativeWindow狀態的變更。基于Windows窗口的NativeWindow實現還提供了一個額外函數,可以讓你獲得一個NativeWindow的HWND(但這個函數并不被控件庫依賴)。現在我還實現了一個基于HWND+HDC的繪圖設備,主要方法就是先注冊全局回調對象,每當知道一個NativeWindow被創建了,我就會注冊一個NativeWindow的回調對象,用來維護一個窗口里面的一塊32位DIBSections位圖緩沖區。窗口的大小如果變化了,我也會在適當的時候重新創建一塊合適的緩沖區。不過為了避免每一次大小變化都會創建新的緩沖區,我創建的緩沖區的大小總會比窗口大一點。然后這個GDI繪圖設備就暴露了一個函數,可以獲得一個NativeWindow的HDC和WinGDIElementEnvironment。

    WinGDIElementEnvironment是基于HWND+HDC的這一套實現上專有的、為了GDI皮膚設計出來的一個公共的資源庫(譬如用來保存各種面向業務邏輯的pen啊brush什么的,比如說disable的時候什么顏色,選中的時候什么顏色等等)。如果你想設計一個基于HWND+DirectX的皮膚,那么類似WinGDIElementEnvironment的這套東西要重新做一次——因為為了達到相同的性能。具體細節相差太大。當然HWND+HDC上面可以有多套皮膚,WinGDIElementEnvironment是公用的。WinGDIElementEnvironment要求繪制是通過一個具體的WinGDIElement對象達到的,而一套皮膚可以有自己的一套WinGDIElement的實現。WinGDIElement被設計成面向業務的、一套皮膚的基本元素組成部分,譬如說按鈕邊框啦、焦點長方形啦、文字啦,而不是帶有pen和brush的長方形啊,文字啊,各種亂七八糟的最低等級的繪圖元素。舉一個例子,按鈕邊框跟菜單邊框很像,都可以用Rectangle來組成。但是Element里面就直接是按鈕邊框和菜單邊框,而不是一個可以讓你自由修改顏色的Rectangle。因為不同的控件要共享配色方案,而配色方案是由業務邏輯+空間狀態的集合實現的,因此WinGDIElement還是一個比較高層次的概念。當一個WinGDIElement被渲染的時候,他會給你一個HDC,然后你根據被設置的狀態來調用GDI函數繪制到HDC指向的32位DIBSections位圖緩沖區上面。

    那么,當我們使用HWND+HDC的實現,創建了一個布滿了控件的窗口,那實際上是發生了什么事情呢?首先控件自己會組成一棵樹。其次,控件的皮膚也會組成一棵樹。現在就有控件樹跟皮膚樹兩顆樹了。控件樹負責所有用戶輸入變更狀態的邏輯部分,而皮膚樹負責繪圖和點中測試。而一個HWND+HDC實現的皮膚樹,會在皮膚組合成樹的時候,在底下又組合出了一顆WinGDIElement樹。因此大局上就是:
    控件樹(負責相應輸入變更狀態)--> 皮膚樹(負責儲存控件狀態的可視部分并決定什么時候需要刷新)-->WinGDIElement樹(負責繪圖整個窗口)

    這個時候,如果我們僅僅需要簡單的重新繪制窗口的話,那么控件樹跟皮膚樹都不需要被訪問到,底層僅需要讓WinGDIElement樹重新繪制一遍即可。而WinGDIElement的粒度實際上也不小,因此不會每一個圖元都有一個WinGDIElement從而使得創建出了一大堆對象的。

    最后一個設計就是在什么時候才重繪窗口的問題。假設說我們現在收到了一個WM_KEYDOWN消息,最終傳播到了控件樹里面去,然后修改了10個控件上面的文字。每當你修改文字的時候實際上都需要重繪,那如何將無數次不可控的重繪合并成一次呢?SendMessage(WM_PAINT)是立刻執行的,所以Windows自帶的合并WM_PAINT的方法在這個時候是無效的。我所采取的解決方法就是:反正控件樹的所有消息來源都是從NativeWindow里面來的,那實際上控件樹發出一個重繪請求的時候,我就會把NativeWindow的HWND實現里面的一個bool變量設成true,然后當NativeWindow每一個傳播到控件樹的消息結束傳播之后,才讀一次那個變量,如果是true,那么就調用WinGDIElement進行重繪并把變量設計成false。壞處是每一個傳播到控件樹的消息在處理完之后都必須檢查是否需要重繪,好處是這個東西被封裝在了NativeWindow的HWND實現里面里面,無論是控件樹、皮膚樹還是WinGDIElement樹也好,都在也不需要關心繪圖時機的事情了。

    因為GUI被分割成了很多層,而且每一層的都關心業務邏輯的不同部分,所以他們都是可以被替換的。譬如說我們可以做成:
    HWND+HDC實現:最普通的方法
    HWND+DirectX:WPF和Silverlight地方法
    單一HWND+多個虛擬窗口+DirectX:可以在游戲里面用

    無論下面的繪圖設備和窗口實現如何發生變化,GUI控件的邏輯部分都跟這些實現嚴格分離,因此不會受到影響。而且大部分情況下,我們是不需要擁有一個跨繪圖設備的皮膚庫的,譬如說游戲和應用程序,外表總不能做成一樣的。對于那些需要同時在DirectX和OpenGL上面運行的程序(譬如說3dsmax),它已經有DirectX和OpenGL的公共接口了,因此這些軟件可以利用它們的公共接口來實現GUI的繪圖設備部分,從而在上面構造起來的皮膚自然是可以跨DirectX和OpenGL的。

    這比起一年前作的GUI實現又進了一大步。上一次的GUI嘗試為不同的繪圖設備抽象一套公共接口,后來慘死。不知道這次實際上做出來的效果如何,拭目以待吧。
posted on 2011-04-29 19:50 陳梓瀚(vczh) 閱讀(5654) 評論(13)  編輯 收藏 引用 所屬分類: 2D

評論:
# re: GUI真TAMA難做啊 2011-04-29 21:45 | 千暮(zblc)
- -bnr 嗯?那個“press me!” .........  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-04-30 07:43 | misserwell
老實說,以我的能力可以做開發,但是我總不愿意去嘗試, 游戲我總覺得是誤人子弟, 浪費別人的時間無異于圖財害命, 不知你可有同感  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-04-30 08:49 | 千暮(zblc)
@misserwell
并非都如此 游戲是思維的潤滑劑和情感的高密度模擬(好的劇情游戲能讓你用最短時間體會到峰回路轉以及學會站在不同人的角度考慮問題 在一種模擬情景 下去發揮你的判斷的極限能力:你可以不用付出代價就在一定程度上訓練人腦置信策略系統)

古代沒有計算機游戲,但不見得就因此不浪費時間而高效;現代有了游戲,但信息獲取更加便捷,這時候需要的是在吸收的同時不斷使大腦適應不同的思維和反應方式,游戲能夠一定程度上滿足此點


PS:不過話說,vczh這次做的GUI不是游戲GUI,通用GUI要比游戲GUI難做  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-04-30 08:50 | 陳梓瀚(vczh)
@misserwell
玩Portal2吧,這個游戲會改變你對游戲的定義的。  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-04-30 08:51 | 千暮(zblc)
@陳梓瀚(vczh)
你到處跟人推銷此款游戲 - -bnr 收取了多少好處費  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-04-30 08:54 | 陳梓瀚(vczh)
@千暮(zblc)
可見該游戲的好玩程度令我愿意免費推銷  回復  更多評論
  
# re: GUI真TAMA難做啊 2011-05-16 23:02 | simfe
簡單點 ,有各duilib可以看看  回復  更多評論
  
# re: GUI真TAMA難做啊 2012-05-21 16:31 | clonne
您好,對于GUI庫,我是這么看的:

現在已經是2012年了,我發覺整個軟件行業都在急速改變,現代的軟件風格明顯和以前的不一樣了,在GUI庫中,我認為微軟的WTL庫非常值得參考,C++的模板就是一個減輕大量細節復雜度的強力工具。

根據我的看法,樓主完全可以不用任何本地控件,不用本地的事件消息系統,不用調用太多本地API,所有的繪制工作都使用3D加速:DirectX/OpenGL,如果是這樣,那么GUI庫的架構就是:

[GUI]
|
[交互]
...
[渲染]
|
[接口] - [DirectX|OpenGL]

當然,我沒描述好,但是可以顯示出,如果按照這種方式,那么基本上就是和游戲差不多了。你只要封裝一些“虛擬控件”的繪制就行了,甚至可以達到很多絢麗的效果而還不影響性能(3D的性能是操作系統的API所不能比的)而且你根本就不用封裝Win32的消息處理、窗口創建等等,這些甚至直接可以讓DirectX/OpenGL幫你完成,而GUI的交互這些都是有API給你提供的!

為什么我推介你用這種方式,是因為如果你想跨inux/Win32/FreeBSD/Debian/..等等平臺使用,即使你能做好一個通用抽象架構,也是會為大量的細節所擊倒的。而使用3D庫,你只要處理DirectX/OpenGL的調用就行了,現在的計算機行業流行的3D庫就這2個,有大量的擴展能使用。

這是我個人的看法,我自己現在都不用GUI庫了,Qt越來越臃腫,GTK不方便發行,其他庫不想學,所以我直接自己調用本地API,或者封裝下。我也很想把我設想的GUI庫做出來。  回復  更多評論
  
# re: GUI真TAMA難做啊 2012-05-21 16:38 | clonne
接LS

樓主,我現在即使是調用本地的API,也有一個原則:只創建一個窗口!不使用Win32的資源、不使用Win32的控件。這讓我減輕了很多細節上的煩惱,以前做界面,需要學習控件使用、大量的莫名其妙的細節問題等等等等。而我現在根本就不理系統,除了那個必要的窗口外,所有的"控件"都是我自行繪制(自己繪制控件的開發時間還沒有以前掌握那些控件的時間多)。現在是調用的系統API來繪制,以后想開始做這個GUI庫了,那就是完全使用3D了。  回復  更多評論
  
# re: GUI真TAMA難做啊 2012-05-22 09:10 | 陳梓瀚(vczh)
@clonne
我真的只創建窗口剩下的都用Direct2D的說,而且我的菜單和下拉框也是真的可以彈出窗口外的……不過盡管如此,架構也是十分復雜的。我倒是不怕復雜,因為win32那套我也封裝過。我之所以想這么干,就是因為WPF功能那么強大本地C++卻用不了太不爽了,所以我重做一個——當然也就跟你說的一樣了。  回復  更多評論
  
# re: GUI真TAMA難做啊 2012-05-22 09:15 | 陳梓瀚(vczh)
@clonne
新版本已經放倒了gac.codeplex.com  回復  更多評論
  
# re: GUI真TAMA難做啊 2012-05-22 17:31 | 三國殺
感覺是大一統思想,這么多庫有必要搞成統一接口嘛?舍棄一些有什么不好的!  回復  更多評論
  
# re: GUI真TAMA難做啊[未登錄] 2012-05-22 23:20 | 陳梓瀚(vczh)
@三國殺
那不舍棄有什么不好?  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情精品久久久久久黑人| 亚洲高清视频在线| 亚洲午夜久久久久久久久电影网| 欧美激情一区二区在线 | 久久夜色精品国产欧美乱极品| 亚洲欧美视频在线| 韩国免费一区| 亚洲国产91色在线| 欧美视频官网| 久久久精品日韩| 免费人成精品欧美精品| 亚洲图片欧美午夜| 午夜精品久久久| 亚洲电影第1页| 99国产精品国产精品毛片| 国产精品欧美风情| 美女主播视频一区| 欧美精品在线一区| 久久国产精品久久久久久电车 | 日韩视频在线观看一区二区| 国产精品久久9| 女仆av观看一区| 欧美日韩在线三级| 久久久在线视频| 欧美人与禽性xxxxx杂性| 亚欧成人在线| 欧美黄色影院| 久久久99爱| 欧美日韩在线综合| 欧美不卡在线视频| 国产精品女主播在线观看| 欧美激情免费观看| 国产精品专区第二| 亚洲精品乱码久久久久久蜜桃91| 国产欧美日韩综合一区在线观看| 亚洲国产成人不卡| 国产在线播精品第三| 在线性视频日韩欧美| 亚洲黄色小视频| 亚洲欧美日韩国产综合在线| 亚洲久久成人| 久久综合婷婷| 久久成人一区二区| 国产精品一区一区三区| 欧美激情一区二区三区蜜桃视频| 国产精品综合视频| 亚洲黄一区二区| 亚洲国产精品一区制服丝袜| 午夜精品久久| 性久久久久久久久久久久| 欧美美女福利视频| 亚洲国产精品va在看黑人| 国产亚洲精品久久久久久| 在线亚洲一区| 亚洲影院免费观看| 欧美日韩专区在线| 日韩视频在线你懂得| 日韩视频精品| 欧美高清视频一区| 91久久午夜| 亚洲精品免费在线| 欧美刺激午夜性久久久久久久| 可以看av的网站久久看| 国产一区二区三区视频在线观看| 亚洲无吗在线| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产综合网| 亚洲精品在线三区| 亚洲图片激情小说| 国产精品美女久久久久av超清| 亚洲图片欧洲图片日韩av| 亚洲天堂av电影| 国产精品草莓在线免费观看| 一区二区三区偷拍| 久久国产精品99久久久久久老狼| 国产欧美va欧美va香蕉在| 欧美一区二区播放| 另类激情亚洲| 亚洲精品一区二区三区樱花| 欧美日韩日日骚| 亚洲永久免费av| 久久久久五月天| 亚洲欧洲另类国产综合| 欧美精品在线免费| 亚洲一区二区三区视频| 久久性天堂网| 亚洲精选中文字幕| 国产精品久久久久久久久婷婷| 欧美在线二区| 亚洲精品久久久蜜桃| 性做久久久久久免费观看欧美| 国内外成人在线视频| 你懂的视频一区二区| 国产精品99久久久久久久久| 久久精品噜噜噜成人av农村| 91久久精品视频| 国产精品视频成人| 米奇777在线欧美播放| 中文一区二区| 欧美高清视频在线播放| 午夜影院日韩| 亚洲免费成人av| 国产亚洲精久久久久久| 欧美精品www在线观看| 亚洲欧美不卡| 亚洲精品免费一二三区| 欧美在现视频| 中日韩美女免费视频网址在线观看| 国产欧美日韩亚州综合| 欧美激情综合五月色丁香小说| 午夜精品网站| 一本到12不卡视频在线dvd| 美腿丝袜亚洲色图| 亚洲欧洲精品天堂一级| 欧美激情国产日韩精品一区18| 在线一区观看| 亚洲国产精品高清久久久| 国产精品毛片| 欧美日韩国产综合视频在线观看中文| 久久久久高清| 午夜久久福利| 亚洲与欧洲av电影| 日韩视频第一页| 亚洲国产aⅴ天堂久久| 蜜桃精品一区二区三区| 亚洲男人的天堂在线aⅴ视频| 日韩视频一区二区三区| 在线观看欧美成人| 国产一区深夜福利| 国产精品自拍网站| 国产精品成人免费| 欧美日韩免费观看中文| 欧美另类videos死尸| 免费成人你懂的| 久热re这里精品视频在线6| 久久久精品一品道一区| 欧美影院成人| 欧美一区二区三区免费观看视频| 亚洲一区二区精品视频| 中国成人亚色综合网站| 一区二区三区日韩精品视频| 亚洲美女淫视频| 亚洲免费电影在线| 99视频有精品| 一本一本久久a久久精品牛牛影视| 亚洲精品美女91| 日韩视频在线观看国产| 一区二区三区高清在线观看| 宅男66日本亚洲欧美视频| 亚洲四色影视在线观看| 亚洲午夜未删减在线观看| 亚洲欧美激情在线视频| 亚洲欧美日韩综合aⅴ视频| 欧美一级久久久久久久大片| 久久精品国产精品亚洲综合| 久久网站免费| 欧美精品一区二区久久婷婷| 欧美日韩成人精品| 国产精品午夜av在线| 国产视频在线观看一区| 伊人激情综合| av不卡在线| 欧美一级淫片播放口| 女人色偷偷aa久久天堂| 亚洲欧洲美洲综合色网| 亚洲无线视频| 久久亚洲春色中文字幕| 欧美日韩三级电影在线| 国产美女精品| 亚洲精品久久久一区二区三区| 一区二区三区精品久久久| 欧美一区二区三区视频免费播放| 久久综合久久美利坚合众国| 亚洲国产欧美国产综合一区| 亚洲视频碰碰| 麻豆av一区二区三区久久| 欧美午夜精品久久久久久人妖| 国模套图日韩精品一区二区| 亚洲欧洲久久| 久久久av毛片精品| 亚洲精品国产精品国产自| 亚洲一区在线播放| 欧美成人精品1314www| 国产精品美女www爽爽爽| 亚洲国产精品一区制服丝袜| 午夜国产不卡在线观看视频| 欧美福利网址| 亚洲欧美日产图| 欧美日本韩国一区二区三区| 国内自拍一区| 午夜久久资源| 亚洲精品视频在线观看网站| 久久久夜夜夜| 国产欧美日韩在线| 亚洲天堂免费观看| 亚洲激情第一页| 久久人91精品久久久久久不卡| 亚洲免费在线视频一区 二区| 亚洲精品少妇30p| 亚洲第一毛片|