由于最近也是比較有時間,想著將Windows版本的地圖繪制引擎移植到Linux。
地圖Render部分采用的是Qt,所以過程非常順利,用Eclipse+CDT重建工程,略微幾個小改動便完成了移植。
但之后發(fā)現(xiàn)了Qt帶來的問題了,地圖繪制引擎支持并發(fā)處理多個繪制請求,不同的繪制請求將在不同的線程Thread中被執(zhí)行,多線程的情況便出現(xiàn)了問題,提示QPixmap不能在非UI線程被構(gòu)造,如果強行構(gòu)造,便出現(xiàn)了內(nèi)存數(shù)據(jù)訪問違例的異常錯誤,進程直接coredump,這個問題困擾了一些時間;
之后改了改代碼,將數(shù)據(jù)處理和繪制代碼隔離開,線程thread中進行數(shù)據(jù)加載、分析、計算,繪制代碼采用Qt的signal/slot機制完成,就是工作線程處理好數(shù)據(jù)之后通過emit signal將繪制請求發(fā)送給ui主線程的slot處理函數(shù)。這種實現(xiàn)方法的問題在于繪制工作都將被串行執(zhí)行,性能下降。
幾年前在移植libsvg到wince時采用過cairo( cairographices.org) ,有點使用經(jīng)驗,且cairo是gnome的標準圖形庫,性能應該不錯,所以直接改為cairo。
cairomm是cairo的c++包裝,編譯還需sig++,cairo的api還是挺豐富的,字體,反走樣,矩陣... 操作也是相當簡單
很快移植完成,運行效果還是比較滿意,現(xiàn)在正考慮地圖引擎移植到ios設備,目前需要琢磨cairomm,sig++,pixmap之類的東西如何移植問題(或者直接采用ios的Fundation的繪圖api)