異步+Vector版本的JPEG編碼器

業界大牛 Thibault Imbert (bytearray.org) 近日將很常用的JPEGEncoder類用vector類改寫了一下,做了一個vector版本的JPG編碼類,效率大幅提升。正好,前不久我也已經做了一個vector版本的JPEG編碼類,在項目中使用,最近正在整理代碼準備分享出來。當然啦,我所做的沒有Thibault那麼深入,僅僅是把Array換成Vector,所以現在就拿他的版本重新修改了一下,加上了異步功能。

所謂的異步編碼,是延時處理代替循環處理。比如寫入1000行文字到一個文件內,可以用for/while循環1000次,一次性寫入,這就是同步處理;也可以寫1行,隔0.5秒再寫下一行,再隔0.5秒繼續寫下一行,這就是異步處理。同步處理的好處是快速,但是對計算機的壓力也比較大,在瀏覽器中使用時,會造成假死,可能會引發穩定性問題。

Vector的效率比Array高了大約4~10倍,但還是不夠高,Alchemy或者haxe的效率會更高一些,因爲它們使用了Flash10未公開的opcodes接口,可以直接操作一段內存數據。Mateusz Malczakhttp://segfaultlabs.com)就做了一個異步Alchemy版的JPEGEncoder,效果很贊,速度比我vector異步版的要快很多,但是缺少了一些自定義參數設置(在壓縮小圖片的時候,看上去效率反而不如Vector,其實不然,實際上,這是因爲程序中寫死了大小2800×2800Alchemy的C源碼修改起來也比較麻煩,要用Alchemy重新編譯。而且因爲編譯了整個libjpeg,所以文件體積也比較大,用C重新寫一遍所有相關的類可以解決大小問題,但問題也會更加麻煩。看起來,haxe生成的swc應當是最佳選擇,正在考慮有空的時候改寫一個。 :)

我將這個幾個放在一起,來看一下例子吧!(需要安裝Flash Player10)

下載 源文件
下載 帶有異步壓縮功能的vector版JPEGEncoder

關於 Alchemy 和 Haxe:

AlchemyAdobe實驗室的一個項目,它的前身是Scott Petersen的“FlaCC (Flash C Compiler)”,目標是讓C語言寫的類能夠被Flash重用。在MAX 2007 大會上,Scott憑藉Flash中暢玩Doom一鳴驚人。Alchemy可以將C語言代碼變成Flash可用的swc文件。這種方式類似於在C語言裏面直接執行彙編語言,效率自然提高很多。目前Alchemy還只是測試項目,但是已經開放了SDK下載,可以編譯許多常用的C類庫。

Haxe 是傳奇的 Nicolas Cannasse 創造的語言。Nicolas 發明了大名鼎鼎的MTASC (Motion-Tween Actionscript Compiler),在AS2.0的時代,改變了AS開發的方式,Flash也進入開源時代。進入AS3.0時代後,Nicolas選擇了自己創造一種語言,這種語言吸取了Flash的優點,並且在語言和編譯器上做了很多優化,使得效率上大幅度提升,這就是Haxe。時至今日,Haxe已經發展爲一個豐富、高效的高級語言,也對Actionscript的發展產生了影響,例如Flash10的Vector,就和Haxe的概念和語法非常相似。

Alchemy公開之後,Nicolas 找到了 Flash播放器中留給Alchemy的未公開的接口,通過這些接口,AS可以直接操作一段內存中的數據。Haxe也使用了這些接口,並稱之爲Flash Memory,藉助Alchemy的接口,Haxe的效率也大爲提升。

 

http://q.pnq.cc/archives/307

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