記 移植ipad牙位圖

10月開始牙位圖,一開始是老大給了張圖片,說能不能實現,有沒有想法,我原本以爲是圖像處理,給出了可以嘗試當時程序中已經存在的一段處理人體圖(OXH所寫,已離職)的代碼處理試試,然後老大讓開始做demo,過程如下:
1. 找到程序出處,來自ipad一個牙位圖程序,售價299美元,簡單瞭解操作流程。


2. 嘗試自己用Tilemap架構 設計了一個牙位圖demo,採用CImage+雙緩衝,引入了層的概念, 並且採用圖片替換的方法,而非圖像處理,效果不錯,但是侷限性在Tilemap地圖式架構不夠靈活,CImage只能簡單圖像處理。




2. 由於採用圖像替換,需要大量的圖片,而部門中沒有美工無法提供,所以嘗試先從ipa牙位圖中提取程序,並且提取出資源圖片png(mac編碼和windows不同,費了一些時間),提取出1800張圖片,變相的發現了其實ipad牙位圖也是採用的圖像替換的方法。

3. 確定非圖像處理,而是採用圖像替換,即一種狀態一種圖像,開始重構牙位圖架構(想做成通用),參考了cocos程序的架構(2D引擎),引入了場景的概念,並且使用GDI+替換CImage,使圖像處理更加靈活(埋下禍根,後文再表),寫了3個基礎框架類Scene->Layer->canvas。


4. 製作類似ipad上的菜單,採用牙位圖相同架構,製作出效果類似的demo, 並且引入幀的概念,實現動畫效果,但是以在PC上不如使用右鍵菜單的理由被否決…


附上結構圖:


以上就差不多實現了一個除具體業務外的功能系統。

接下來是優化的過程,起源來自於我無意中發現,開啓牙位圖後,我的CPU佔用會達到12%左右,此前設計中,我是採用定時器來定時刷新界面,刷新頻率爲100MS,我的電腦是I5 4200U,雖然是U核,但是也屬於不錯的CPU了,想想現場的老爺機,還是優化吧。


1.一開始懷疑是定時器的問題(後來發現不是),猜測可能是因爲定時器設置頻率過快,導致每一幀還沒刷完(也就是圖片放入統一緩存,再打到屏幕)一幀,下一個定時器又來了,導致了等待,所以CPU佔用高。

解決方法:使用線程,主線程中調用繪圖線程,繪圖線程設置了無限繪圖,每繪一次 sleep(50),CPU佔用仍然是12%左右,幀數是9幀/S,排除了是定時器的問題, 這時也發現了幀數很低,說明繪圖的過程很慢。

2.接下來發現內存跳動很快,猜測是繪製過程中不斷的new了,發現Graphics 在構造函數中new了對象(構造函數new.....),等於是每一幀都new一次,釋放一次,改爲成員變量,發現CPU佔用不見好轉,但是內存相對穩定(其實看不大出來)。

3.然後接下來的問題要先說說程序的架構,牙位圖是由一張緩存圖片,然後將LAYER緩存(緩存:其實有一個更新標誌,如果未更新,就是一張圖片圖片,更新,則重新生成緩存,把一系列圖片繪製在一張圖片緩存中)打入緩存中,然後繪製選擇流動矩形框,最後再將這張緩存打到屏幕上。查看了層Layer發現有60幾層,30幾層牙齒+30幾層文字,其實在平時不動的時候繪製,這60幾層是不變的,變的只有流動矩形框,所以再做一層緩存,只在這60幾層中的緩存更新時再進行重繪的操作。相當於一個空間換時間的操作。完成後發現CPU大概到10左右,仍然不明顯。

4.該想的優化都做了,谷歌吧,發現了幾篇文章說是GDI+的問題,可以提到幀速(這和CPU什麼關係,扯遠了),特別的DrawImage,效率十分低下,而且如果不在一開始指定圖片緩存特定格式,則生成的緩存格式爲不定,參考一篇外文,http://www.codeproject.com/Tips/66909/Rendering-fast-with-GDIplus-What-to-do-and-what-no.aspx ,全部初始化爲PixelFormat32bppPARGB格式,發現CPU顯著降低了,大概在4%左右。

5.最後的最後本來想做GDI+和GDI混合使用的優化,因爲GDI在這塊效率會比GDI+好,但是項目時間問題,沒有繼續。

總結下優化:
        // 1、緩存GDI+對象,避免構造函數的new操作
// 2、只在層中有變化時重新繪製場景,其餘則只在場景之上繪製矩形框,然後打到屏幕
// 3、構造函數時format爲相同格式圖片,避免不同格式各種轉換消耗CPU
// 4、儘量使用GDI,而不是GDI+,特別是DrawImage,效率非常低下(此條未實現)
// 參考文章:http://www.codeproject.com/Tips/66909/Rendering-fast-with-GDIplus-What-to-do-and-what-no.aspx
// 還有其他相關文章關鍵詞:GDI+優化

至此,就是一些業務性的東西了,附上一些性能的圖片吧

優化前:

優化後:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章