GacUI 已經讓幾乎所有 Demo 「完全去掉反射」

現在就剩下兩個跟列表綁定相關的Demo還需要進一步處理了。今天剛剛把內存大戶 ControlTemplate/BlackSkin 也給轉換了,這是一個使用XML來實現Visual Studio 2013的黑色皮膚的例子,也是編譯的時候最慢的。因為每一個皮膚最終都是一個類,所以做語法檢查的時候需要進行大量的工作。在去年的時候,所有的Demo都需要反射才能運行,當然也包括這個Demo,因此初始化的時間也可以被肉眼觀測。

但是現在情況已經完全不同了!XML轉C++的功能終於覆蓋到了這個倒數第三個Demo了,因此初始化就是一大段C++代碼跑完,窗口就出來了。而且拖動窗口的邊緣讓程序(主要是其他的TabPage)進行「實時」排版的時候,就算是Debug模式也根本看不見任何延遲。Release模式下甚至只要以雙擊BlackSkin.exe,一瞬間就看到了這個窗口。

現在還有一個小問題,就是Release模式的exe高達3.5M,當然這其中一個原因是XML是在寫的有點複雜,內容多程序自然就大了。不過3.5M比起之前地34M已經處於可以忽略的情況了,等以後再繼續優化。BlackSkin.bin這個編譯好的二進位資源文件,因為之前需要包含所有XML編譯出來的位元組碼,竟然有18M那麼大,所以加起來一共有34M。現在不需要位元組碼了,只剩下848KB,其中的843KB是目錄下面的png文件,全部都打包進去了,部署超級方便。

當然BlackSkin.bin也可以不成為一個文件的,你完全可以把它當成exe的資源文件直接鏈接在exe裡面,運行的時候用API讀出來,轉成 vl::stream::MemoryWrapperStream,就可以被載入了。跟載入文件是一樣的。使用DecoderStream + LzwDecoder,你甚至可以直接讀取GacGen.exe根據你的配置創建的壓縮後的BlackSkin.bin。

時隔兩年,GacUI的絲般順滑feature終於也覆蓋這種超複雜的XML了,而且佔用的內存比WPF小一大截,響應也比WPF要更快。果然純粹的native代碼就是迅猛啊。覺得自己真是太牛逼了(逃

當然這個UI咋一看其實也不是很複雜,但是因為我的排版大部分是面向Table的(就像css的grid和flex的組合),所以但凡任何東西都使用Table,這個截圖的幾個TabPage加起來,應該有幾百個Table了。這麼多Table根據屬性互相制約,每次拖動窗口的時候都要不斷地計算,收斂到一個結果才算排版玩,然而哪怕是被VC++調試的Debug模式下,也是一點感覺都沒有,不斷的拖動窗口邊框,排版的計算比屏幕的刷新率還跑得快。Release就更不用說了。

一個好的架構和演算法帶來的好處,就是可以讓使用者胡來,不需要有心理負擔。就像在寫C#程序一樣,Linq亂寫一氣,程序又快又穩定。

值得注意的是,上面的那個日曆是根據Windows的界面語言跑的。如果你在英文模式下打開,那就是英文的。就算你裝了綠綠語,他也會變成綠綠語。富文本框也是支持綠綠語這種從右向左中間插著從左向右,幾十個wchar_t粘成一個字元的這種語言的。

推薦閱讀:

Keynote排版審美提升計劃(第4期):扁平辦公
為什麼相同長度的豎線與橫線,看起來豎線比橫線長?
這樣的一個封面設計還能怎麼改進?
為什麼 Times New Roman 字體被經常使用?
電子書出現空白頁時通常會寫上一句 "This page has been left blank intentionally",為什麼需要這樣?

TAG:GacLib | 图形用户界面 | 排版 |