http://blog.2ndboy.net/%E4%BB%8B%E7%BB%8D%E4%B8%A4%E4%B8%AA-2d-%E5%9B%BE%E5%BD%A2%E5%BA%93/
最近的項目需要找到一款跨平台的 2D 圖形庫,最好能在使用介面上相容 MicroSoft 的 GDI+,經過一番搜尋跟對比,總結了一些這方面的資訊放在這裡做個筆記。
首先介紹一下 Cairo 庫,沒聽說過沒關係,FireFox 總聽說過吧?!FireFox 的 render 引擎用的就是這個庫。Cairo 是一個跨平台的 2D 圖形庫,支援很多 GDI+ 的進階特性,比如 Anti-alias,矩陣變換等等,但是據說
Cairo 的效率不是很好,跟其它庫有一定的差距。
用 Cairo 最爽的地方在於有個跟它相配合的 libGDIPlus 庫,這個庫對 Cairo 進行了封裝,對外提供了一個 GDI+ Flat API 相容的使用介面,這樣就為把 Windows 平台下的 GDI+ 代碼移植到 Unix 或者
Mac 平台下提供了一條捷徑。
下面要介紹的是 AGG(Anti-Grain Geometry),這個庫貌似效率很好,可以去它的Demo
展示頁面去看看,裡面的小例子都非常的酷!
AGG 也有一個類似於 libGDIPlus 那樣的封裝,叫做 AggPlus。但是美中不足的是 AggPlus 對 GDI+ 介面的封裝充其量只實現了 20%,基本上沒有實用價值,但是拿來跟 GDI+ 做效能比較測試還是比較方便的。其實在 AggPlus
的下載包裡面就有這麼個效能測試程式,在某些基本圖形的 render 測試中 AGG 居然比 GDI+ 快 10 倍以上!
Cairo 跟 AGG 都是非常不錯的 2D 圖形庫,雖然我始終沒辦法在 Cairo 跟 AGG 之間做效能測試,但是貌似 AGG 比 Cairo 的效能要好;在特性方面,他倆似乎不分伯仲,GDI+ 1.0 裡有的 feature 幾乎都能在這兩個庫裡找到對應物;在 interface 方面,Cairo + libGDIPlus 是一對黃金搭檔,只要你熟悉 GDI+ 的 Flat interface,很快就能把 Cairo 加到自己的項目裡面;AGG 的 interface 比較另類,完全基於 C++ Template
寫就,基本上屬於看了文檔還感覺很暈的那種,有人說要想把 AGG 用起來,要有比較好的圖形學知識,深以為然!
從跨平台和編譯上比,AGG 全面勝出,在 Windows/Unix/Mac 三個平台下都輕鬆通過,Cairo 就稍差一點點,在 Windows 平台下需要經過一定的修改(當然首先要熟悉一下才能修改)。在 Windows 下編譯 libGDIPlus 貌似就是不可能完成的任務,至少我花了一些時間後放棄了這個念頭。
在跟同事解釋 Cairo + libGDIPlus 和 AGG 的最顯著區別時我打了個比方,前者就像是一輛整裝待命的國產車,後者就像是一堆精緻的進口汽車配件。把前者用起來比較容易,但是可能效能一般;把後者用起來需要花很多時間,還要有專業知識,但是一旦跑起來那就很爽!