今天無意間發現了一篇文章說到了使用Alchemy來讓flash的as代碼調用C代碼的功能接口的方法,目的是爲了能在flash環境下使用C的東西,另外一個角度來說可以更好的發揮C語言的強大能力和效率了;
我學習Alchemy是被客戶逼的,客戶的AIR項目中涉及到大量的數值計算,以至於用AS3寫出來後沒法運行:長時間不響應。後來將這段計算量大的代碼用VB寫了,用swf調exe纔算結束。但設置有些不便,客戶吹毛求疵。不得不尋找新的解決方法。感謝QQ羣裏的一些達人,我開始關注並瞭解 Alchemy,最後解決了這個棘手的問題。對於Alchemy我知道也不多,大概瞭解他可以將C/C++的編碼給AS3調用,提高AS3的效率,具體的解釋可以參考官方的定義。下面我以一個簡單的例子,講述Alchemy的簡單用法。不一定很精彩,有些地方是我個人不明真相的理解,或許壓根就不對,但如果你想了解Alchemy,建議你讀下去,總會有些收穫的。同時,一併希望有人能指點一二。如果我前幾天能看到這篇教程,就不會走許多彎路了。基本上,該遇到的麻煩,我都遇到了。
目的:用Alchemy和Actionscript3計算從1累加到N的值。(N越大,越能比較出速度的快慢)
工具:Alchemy,Cygwin,FlexSDK,Java(JRE),FlashCS4. (可能用到:Dev-C++,AirSDK1.5)
步驟:
1、下載
下載之前,說一下這幾個軟件的關係,便於理解。看圖,就是我的理解。
Alchemy下載頁面(點此直接下載文件): http://labs.adobe.com/downloads/alchemy.html
Java(JRE)下載頁面:http://java.sun.com/javase/downloads/index.jsp
FlexSDK下載地址(點此直接下載文件):http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3
Cygwin下載頁面(點此直接下載文件):http://www.cygwin.cn/site/install/
注:
a、FlexSDK要求是3.2或以上版本。如果安裝了Flex,可以在安裝文件夾裏面找,不用下載。
b、到java下載頁面試了一晚上,發現沒法下載,不知道是不是我的網絡問題……備用地址:http://down.tech.sina.com.cn/page/13444.html
c、Cygwin下載的文件只是一個下載器,可以根據下載頁面給的提示進行下載。具體請看下一步:安裝。
2、安裝
爲便於測試方便,把這些軟件都安裝到了C盤根目錄下。
a、Alchemy,下載解壓縮後,放在C:/alchemy 路徑下。
b、Java,這個直接點擊,一路next安裝就可以了。
c、FlexSDK,下載解壓縮後重命名,放在C:/FlexSDK路徑下。
d、Cygwin,一路默認next,到“Select Package”那個界面時,會有一個列表,需要選擇如下三個包:
Archive -> zip
Devel -> gcc-g++
Perl
再然後,一路默認next。最後桌面上會有一個“Cygwin”的快捷方式。
(如果網速很慢,中間會跳出一些安裝不成功的窗口。重新裝即可。如果安裝少文件,在Cygwin命令行輸入命令時會出錯,比如:"perl" not available,"zip" not available)
注:因爲得要Cygwin知道FleSDK和Alchemy的路徑,所以還要設置一點東西:
將C:/cygwin/etc 文件夾下的文件"profile"中
PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH.
改成:
source /cygdrive/c/alchemy/alchemy-setup
PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/cygdrive/c/alchemy/achacks:/cygdrive/c/FlexSDK/bin:$PATH
然後保存文件(注意裏面的路徑……c/alchemy/……)。
3、轉換
再然後的步驟,就可以將*.c轉換成*.swc了。以Alchemy自帶的例子舉例:C:/alchemy/samples/stringecho
a、點擊桌面上的“Cygwin”快捷方式,開啓Cygwin命令窗口。
b、進入alchemy目錄,開啓alchemy,根據提示命令如下:
cd C:/alchemy
./config
source /cygdrive/c/alchemy/alchemy-setup
alc-on
c、進入stringecho,並編譯c到swc,命令如下:
cd samples/stringecho
gcc stringecho.c -O3 -Wall -swc -o stringecho.swc
一會,就會在相同目錄下多出一個swc文件了。
4、應用
接下來,就是用FlashCS4來應用這個編譯好的stringecho.swc了。
a、新建一個Flashcs4文件,把stringecho.swc添加到庫路徑中:
並在發佈設置裏面的發佈成swc裏打勾(必須,否則出錯,原因未知):
第一幀加代碼:
Import cmodule.stringecho.CLibInit
var test:CLibInit = new cmodule.stringecho.CLibInit;
var lib:Object = test.init();
trace(lib.echo("foo"));
ctrl+enter測試,如果trace出foo,說明測試成功。
注:如果要發佈成air,則需要air的版本是1.5版。否則出錯。(比如提示:"1046:Type was not found or was not a compile-time constant:Vector.")
5、例子
上面基本上把整個流程過了一遍,現在開始累加1到N的例子了。C我不大懂,直接根據“stringecho”這個例子的代碼照葫蘆畫瓢整的(源碼中的文件:sum.c)。
在編輯sum.c這個文件的時候,需要編譯運行該文件,以便測試效果,所以還可能需要用C編譯器。我用的軟件是:Dev-C++(這裏是下載地址)。但是最後的sum.c用到了as的庫(#include "AS3.h"),所以不能完全用Dev-C++來測試。好在用Cygwin編譯c到swc的時候,如果編譯出錯,會有提示。
c和fla裏面的代碼就不再囉嗦了,源文件附上。如果還是鬧不清,可以多想一下那個廚師做糖醋里脊的例子,對比一下各個軟件的關係。
6、感謝
多謝閃無憂QQ羣裏的星光,汪汪和牛牛豬。如果不是他們在羣裏談論Alchemy和發截圖,我是不會想到要用這個方法來解決項目中的問題的。當然,還要感謝那個吹毛求疵的客戶。
本文主要參考瞭如下兩篇文章,表示感謝:
http://www.insideria.com/2009/04/setting-up-adobe-alchemy.html
http://bbs.actionscript3.cn/thread-20233-1-1.html
參考: