筆者最近試著把文字用writeUTFBytes的方式寫成檔案,雖然用文字編輯器讀取不會有問題,但如果再以Flash的URLLoader方式載入,文字會變成亂碼,且無法轉成XML物件,找了半天才發現問題出在BOM上
[教學]在FlashDevelop中使用條件編譯
最近因為工作的關係,又把FlashDevelop裝起來了,雖然以前只拿來寫AS2,很少用來開發專案,不過裝完後才發現竟然新增了這麼多功能,且Plugin也很多,有許多FlashBuilder沒有的便利功能,雖然還用不習慣(快速鍵又要重背了...),但有機會筆者再介紹幾個不錯的Plugin。
[心得]將Unity log顯示在Firebug上
之前有介紹過把Flex log顯示在Firebug上,這次改寫一個給Unity用的版本,之所以使用Firebug是因為Firebug在顯示上很清楚,且如果把顯示寫在onGUI上,onGUI錯掉也是不能顯示log,所以把log切出是比較理想的
ProtocolBuffer VS AMF3(fixed)
感謝Atry的指導,筆者修改了一下範例,以求更客觀的比較結果,順便也比較一下修改前及修改後的效能差異
主要修改的有兩部分:
1. 使用optional取代required
2. scalar最佳化
[教學]在Flash中使用Google Protocol Buffers
Protocol Buffer是Google所提供的一種結構化資料的編碼方式,俱備高效的序列化速度且支援格式擴充。以Flash來說就是類似AMF的資料傳輸格式,由於Protocol Buffer有支援多種語言版本,這次就來介紹Flash版的Protocol Buffer。
[教學]在AS3中使用列舉
Actionscript 3本身沒有列舉,所以在開發Flash專案時大都以常數宣告成整數或字串的方式來區分類別,雖然不會有問題,但在開發大型專案時,常數的宣告方法反而會成為維護上的大問題。
Flash P2P 研究
Flash 10及AIR 1.5支援P2P連線,這種通訊技術叫做Real-Time Media Flow Protocol (RTMFP),跟FMS(Flash Media Service)的RTMP不同,RTMFP是架構在UDP層,允許點對點連線,使用者只需連到RTMFP-capable 伺服器即可,目前Adobe有提供免費的伺服器─Stratus,透過Stratus我們可簡單做出VOIP或電視電話的功能,當然也能運用在遊戲上。
比較兩種技術,RTMP是透過伺服器溝通,所有的訊息都需經過伺服器,而RTMFP只需透過伺服器建立連線,之後的訊息交換以兩台電腦為主,且Stratus允許本地及NAT連線,在一般網路環境都可正常運作。
Flash P2P遊戲:real time mill
Stratus:http://labs.adobe.com/technologies/stratus/
教學影片:http://www.flashrealtime.com/tuts/p2p-in-flash.html
教學網站:http://www.flashrealtime.com/basics-of-p2p-in-flash/
RTMFP FAQ:http://www.scribd.com/doc/3798516/Flash-Player-10-RTMFP-FAQ-070208
[教學]使用Subclipse做Flex版本控管 Part2
繼上篇介紹過Subclipse安裝之後,接著介紹如何使用Subclipse開設新專案
筆者這次測試是用Google code的專案代管,這是Google所提供的免費空間,有1G的容量且支援SVN。
首先切換Perspective,在window -> Perspective -> Other 下找到瀏覽SVN檔案庫
接著在檔案庫上按右鍵選新增 -> 檔案庫位置,輸入SVN位置
新增好後會要求名稱及密碼,都輸入完後回到Flex Perspective
接著到要同步的專案,在專案上點右鍵,選擇 team -> share project,更新類型為SVN,接著選剛設好的SVN位置點下一步
這個步驟是匯入目前專案到SVN,但還沒真的更新,匯完後先把要加入SVN的檔案用右鍵 team -> add加入
這樣也還沒更新到伺服器,最後選team -> 送出才會上傳,上傳後可以試著改改看文件再上傳一次,我們來測試回復的動作
在文件檔點右鍵選team ->顯示資源歷程可看到文件更新歷史,這裡會顯示版本、日期及註解,點選要回復的版本按取回
顯示資源歷程也可以比較版本差異,SVN還有許多功能,筆者才剛試不久還沒摸熟,如果有什麼心得或意見也歡迎留言 :D
[教學]使用Subclipse做Flex版本控管 Part1
Subclipse是給Eclipse的Subversion(SVN) Plug-in,所以基於Eclipse的Flex也能安裝,版本控管的好處在於在多人開發時能妥善分配權限,且資料集中在伺服器,不必憺心個人保管的問題,即使不小心修改錯了,SVN也能回溯先前的版本,保持專案正常運作,這部分的控管在大型專案很常見,但個人開發的Library也可用SVN做版本控管,以下做個簡單教學。
1.下載並安裝Subclipse
使用Help -> software updates -> find and install -> new remote site,輸入以下網址安裝,由於Flex的Eclipse是3.3版,所以可裝1.4及1.6,筆者這次的範例是裝1.6版。
subclipse 1.6.x:http://subclipse.tigris.org/update_1.6.x
subclipse 1.4.x:http://subclipse.tigris.org/update_1.4.x
官網的安裝教學:http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA
有些功能需要別的Plug-in支援,沒有的話可以取消勾選
2.使用Subclipse取回專案
先開啟SVN伺服器專案,使用File -> new -> other找到SVN,選自SVN取回專案
筆者這次是測試,所以先抓了Papervision3D的SVN做範例,另外有沒有人注意到,Subclipse很貼心的提供中文語系,雖然不完整,但看起來很有親切感。
取回trunk後放到本地的專案上,接下來的操作就跟一般一樣,要更新或送出只要按右鍵選Team即可
筆者當然沒有權限修改Papervison3D,所以只能更新,自己架設伺服器就可使用送交,把新版本送上伺服器。
這次範例只示範了安裝及取回,下一篇再來介紹使用Subclipse開設新專案
[心得]使用Flash 操作 PDF
最近剛好有用到,把心得整理一下
一、使用Flash顯示PDF:
Flash可透過HTMLLoader直接顯示PDF,而Flex則可用HTML Tag,這兩者都是用瀏覽器嵌入的方式呈現,效果跟Firefox、IE直接打開PDF一樣,雖然能顯示PDF,但Flash的渲染邏輯跟想像的不同,顯示的PDF文件會被置於最上層,跟Flash Index無關,且無法操作PDF文件,有一種比較特殊的作法是Cross-Scripting,透過Flash -> DOM -> PDF -> Javascript的方式操作,HTMLLoader讀取嵌入PDF的網頁,透過DOM操作PDF內的JavaScript,這種做法很麻煩而且PDF必須事先埋JavaScript,有興趣的朋友可參考Cross-Scripting PDF一文。
剛談論的HTMLLoader跟HTML都只能在AIR中使用,也就是Flash並沒有給Web顯示PDF的方法,雖說如此,網路上還是有看到有人用Flash做PDF Viewer(豆丁網),這部分可能是使用PDF轉SWF的技術,由於PDF文件格式是公開的,所以網路上有很多第三方的Parser,其中一種就是PDF轉向量SWF檔,這種技術的好處是可完整操作,且也能去掉一些文件屬性,像是Navigate tag跟Page Layout等..,讓顯示不受文件影響。
補充一些線上的PDF轉換網站:
PDF Online:http://www.pdfonline.com/convert-pdf/
PDF Convert:http://www.freepdfconvert.com/
PDFMenot:http://pdfmenot.com/
二、使用Flash產生PDF
有個好用的第三方Library─AlivePDF,這是改自PHP的FPDF,可產生文字及圖片,功能很完整但不支援中文 ,該作者也有注意到這個問題,期待他的更新版
AlivePDF:http://www.alivepdf.org/
三、使用Flash解析PDF
Parser的部分比較少,筆者只找到Pavo這個由日本人撰寫的Parser,只能取出PDF的資訊及內文,無法取出圖片,重點是沒什麼教學,且裡面有用到File、FileStream等AIR才有的Class,所以這個Parser也只能給AIR使用。
AStar路徑演算法初探
A*是著名的尋路演算法,在即時戰略遊戲很常見,主要是用來找出最短路徑,筆者參考Patrick Lester的A* Pathfinding for Beginners一文,試著用Actionscript3實作A*,為了加快效能,全部改用Vector取代Array,所以以下範例請用Flash Player10以上版本觀看。
先簡單說明一下A*的邏輯,A*是藉由評分制來取得最短路徑,有三個參考值F、H、G,F是H跟G的總合,最後拿來參考用,而G是由起點到目前位置所需的移動耗費,也就是移動距離參考,而H比較特殊,這是一種啟發式的預測,估算目前位置到終點所需的移動量,H有很多種算法,這次的範例是採用最簡單的Manhattan演算法,直線且不考慮障礙物
第一個範例把評分列出,黃色區塊為算出的最短路徑,而淺藍色區塊為有運算過的節點,按下空白鍵可切換四方向及八方向移動
套用PV3D,這樣感覺就比較像遊戲了,如果加上移動限制及回合,就能做出SLG戰略遊戲的效果,下次再寫個範例試試
體驗更強大的AIR:Merapi
Merapi能實現AIR與Java溝通,讓AIR可以透過Java去存取USB、Bluetooth、GPS..等AIR不支援的IO設備,或是直接執行本機檔案、開啟目錄等...。或許有人會質疑,既然都要透過Java了,那不如用Java開發就好,何必使用AIR?其實就以UI開發來講,Flash是非常方便的工具,尤其是Flex的mxml,基本上就是為了UI所設計的語言,強大的排版能力、多樣的特效及CSS的概念等都是使用AIR開發的好處。
附上教學影片及網站給大家參考:
官網:http://www.merapiproject.net/
教學:http://playground.deju.nu/2009/04/getting-started-with-merapi/
MVC Framework總整理
接觸MVC Framework半年多了,把之前的筆記做個整理,希望能對想學Framework的朋友有幫助
一、Cairngorm:
Cairngorm是官方的MVC框架,有完整文件及教學, 事件驅動及能使用Flex特有的data binding跟state,不過資料管理過度集中,存取的資料只給ModelLocator管,在較大一點的專案會變很亂。
範例教學:http://waterxbread.blogspot.com/2009/03/micro-architecture-cairngorm.html
二、PureMVC:
PureMVC為獨立的事件驅動架構, 支援多語言(C#、Java、PHP…),雖然相容性高,但並未使用到Flex的好處,在大型專案裡類別會多到赫人(不過修改功能很容易)。 使用Code-Behind寫法(Mediator),UI跟程式分開,在Module溝通上也有許多好用的Utils
PureMVC範例教學 Part1:http://waterxbread.blogspot.com/2009/03/micro-architecture-puremvc-part1.html
PureMVC範例教學 Part2:http://waterxbread.blogspot.com/2009/03/micro-architecture-puremvc-part2.html
PureMVC Util,使用Pipes實現Module溝通:http://waterxbread.blogspot.com/2009/03/puremvc-pipes-util-module.html
PureMVC Util,使用Fabrication與Module溝通::
http://waterxbread.blogspot.com/2009/04/puremvcfabricationmodule.html
三、Mate:
Mate 一樣為事件驅動架構, 使用標籤語法,跟Cairngorm一樣能使用data binding,並簡化了端溝通(RemoteObjectInvoker、HTTPServiceInvoker...),撰寫上比較簡單,且依賴注入的特性,可不破壞原架構加入功能
Mate範例教學 Part1:http://waterxbread.blogspot.com/2009/06/mate-framework-part1.html
Mate範例教學 Part2:http://waterxbread.blogspot.com/2009/06/mate-framework-part2.html
[PV3D] ReflectionView
又把小牛拿出來了,PV3D內附的反射效果,繼承自BasicView,可直接放置在舞台上,使用相當簡單
有三個值可設定,surfaceHeight為ReflectionView內的Camera高度,viewportReflection是真正操作的反射Viewport,元件為Sprite,一樣可加Filter或其它設定,而setReflectionColor則可設定反射的ColorTransform
surfaceHeight = 0; viewportReflection.filters = [new BlurFilter()]; setReflectionColor(.7, .7, .7);
要特別注意的是,一定要用SingleRender來Render場景,雖然是繼承BasicView,但反射的渲染只寫在SingleRender,StartRendering及onRenderTick只會渲染基本Viewport,不會有反射效果
[教學]Mate Framework Part2
part1介紹過Mate架構跟流程,這次寫一個簡單範例來說明Mate的寫法
範例為使用DataGrid操作來自DataManager的資料。按此觀看範例
Main.mxml
同上次的架構,程式的進入點是Main.mxml,裡面只要宣告EventMap、ModelMap跟要使用的UI
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
xmlns:maps="idv.gd.hellomate.maps.*"
xmlns:view="idv.gd.hellomate.views.*"
width="600" height="350">
<mx:Style source="assets/style.css"/>
<maps:MainEventMap/>
<maps:ModelMap/>
<view:DataList/>
</mx:Application>
DataList.mxml
DataList.mxml 為列表的UI,負責顯示、新增及刪除,在Mate架構中,UI的Domain Logic直接寫在mxml,或許會有點亂,但這種寫法也方便Mate做Data Binding
<!-- 部分程式碼 -->
<!-- mate特有的Dispatcher,即使元件不在顯示列表或不可見,仍可送訊息給Mate -->
<mate:Dispatcher id="deleteAllDispatcher"
generator="{ListEvent}"
type="{ListEvent.REMOVE_ALL}">
<!-- 可直接接收來自EventMap的回應 -->
<mate:ResponseHandler type="deleteItemResponse" response="Alert.show('ok')"/>
</mate:Dispatcher>
<!-- 能監聽自己內部跟Mate事件 -->
<mate:Listener type="{NavigationEvent.ADD_STATE}" receive="stateChangeHandler(event)"/>
<mate:Listener type="{NavigationEvent.LIST_STATE}" receive="stateChangeHandler(event)"/>
<mx:DataGrid id="myDG"
x="10" y="10"
width="560" height="215"
dataProvider="{currentListAC}">
<mx:columns>
<mx:DataGridColumn headerText="標題" dataField="title"/>
<mx:DataGridColumn headerText="訊息" dataField="message"/>
</mx:columns>
</mx:DataGrid>
事件可由Mate的Dispatcher送出,也可使用原本的EventDispatcher,但事件的bubbles一定要為true,而<listener>的標籤可以聽到來自Mate的事件,但自己Bubbles上來的事件也會聽到,在設計時要注意
三種在Mate中傳事件的寫法:
一、使用<Dispatcher>:<mate:Dispatcher id="deleteAllDispatcher" generator="{ListEvent}" type="{ListEvent.REMOVE_ALL}">,用調用時呼叫 deleteAllDispatcher.generateEvent();
二、使用原生的EventDispatcher:this.dispatchEvent(new NavigationEvent(NavigationEvent.ADD_STATE));,由於事件bubble為true,EventMap可聽到事件
三、使用程式碼的Mate Dispatcher: var mateDispatcher:Dispatcher = new Dispatcher(); mateDispatcher.dispatchEvent(listEvent);
ListEvent.as
自定事件,寫法同一般Flash事件寫法,但為避免混淆,Mate建議在事件的常數後加上Class名,好讓事件不會重覆
public class ListEvent extends Event
{
//常數後加上Class名,避免名稱重覆
public static const DELETE:String = "deleteListEvent";
public static const REMOVE_ALL:String = "removeAllListEvent";
public static const ADD:String = "addListEvent";
public var item:ItemInfo;
//bubbles要為true,給EventMap聽
public function ListEvent(type:String, bubbles:Boolean = true, cancelables:Boolean = false, item:ItemInfo = null)
{
super(type, bubbles, cancelables);
this.item = item;
}
override public function clone():Event
{
return new ListEvent(type, bubbles, cancelable, item);
}
}
DataManager.mxml
為管理列表資料的Manager
public class DataManager
{
public var listArrayCollection:ArrayCollection;
public function DataManager()
{
listArrayCollection = new ArrayCollection();
listArrayCollection.addItem(new ItemInfo("first item", "hello mate"));
listArrayCollection.addItem(new ItemInfo("second item", "test"));
}
public function deleteItem(item:ItemInfo):void
{
if (listArrayCollection)
listArrayCollection.removeItemAt(listArrayCollection.getItemIndex(item));
}
public function deleteAllItem():void
{
if (listArrayCollection)
listArrayCollection.removeAll();
}
public function addItem(item:ItemInfo):void
{
if (listArrayCollection)
listArrayCollection.addItem(item);
}
}
DataManager封裝了資料操作,這裡只外露一個listArrayCollection給外部View使用,也可把ModelManager做為資料物件跟View挷定,但要記得要給class設[Bindable],或自定Binding事件
MainEventMap.mxml
為Mate事件的中心,用以管理事件及專案的Business Logic
<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns="http://mate.asfusion.com/" xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import idv.gd.hellomate.events.*;
import idv.gd.hellomate.business.DataManager;
]]>
</mx:Script>
<!-- 監聽Mate事件,可呼叫Manager執行方法(Manager只會被生成一次)-->
<EventHandlers type="{ListEvent.DELETE}">
<MethodInvoker generator="{DataManager}" method="deleteItem" arguments="{event.item}"/>
</EventHandlers>
<EventHandlers type="{ListEvent.REMOVE_ALL}">
<MethodInvoker generator="{DataManager}" method="deleteAllItem"/>
<!-- 回應訊息給呼叫者 -->
<ResponseAnnouncer type="deleteItemResponse"/>
</EventHandlers>
<EventHandlers type="{ListEvent.ADD}">
<MethodInvoker generator="{DataManager}" method="addItem" arguments="{event.item}"/>
<!-- 發送Navigation事件 -->
<EventAnnouncer generator="{NavigationEvent}" type="{NavigationEvent.LIST_STATE}" />
</EventHandlers>
其中<EventHandlers>的標籤為註冊Event要觸發的事件,這裡能調用ModelManager的方法,並可直接回傳內容(<ResponseAnnouncer>)或是呼叫事件(<EventAnnouncer>)
ModelMap.mxml
<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns="http://mate.asfusion.com/" xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import idv.gd.hellomate.views.DataList;
import idv.gd.hellomate.business.DataManager;
]]>
</mx:Script>
<!-- 注入資料,DataList生成時自動注入 -->
<Injectors target="{DataList}" debug="true">
<PropertyInjector targetKey="currentListAC" source="{DataManager}" sourceKey="listArrayCollection"/>
</Injectors>
</EventMap>
ModelMap.mxml底層其實是EventMap,這裡分出來只是為了釐清架構。其中<Injectors>是很特殊的標籤,會在目標元件生成時自動把資料注入,且若是Bindable物件,之後就可靠物件自己更新,在寫法上很方便。
總結
這次只寫個簡單範例練習,由於Mate可用Data Binding,在寫法上會比PureMVC好寫很多,但實際上使用還是要看專案的複雜度,沒有人說那個MVC Framework是最好的,端看開發人員習慣那種架構。
這次的練習不夠完整,如果寫法或概念有錯還請指正,謝謝
[教學]Mate Framework Part1
Mate是給Flex開發的Framework,跟Cairngorm一樣只能在Flex下運作,比較特別的是Mata以mxml標籤撰寫,特有的EventMap跟Injector可在不破壞原架構的情況下注入行為,屬於非侵入式的框架。
一、架構
官網並沒有特別解釋要分成那幾類,這是按照官網範例的分類法,給大家參考
business:放置資料管理的ModelManager
events:放置自定事件
maps:放置EventMap跟ModelMap,Mate的主要核心
views:放置要顯示的UI Component
vos:放置Value Object
最外層為程式的進入點(Main.mxml)
二、流程
官網有完整的流程圖,這裡只挑幾個筆者覺得常用到的來講
先看一下mate的雙向流程圖
如上圖,View透過事件驅動EventMap,在Mate裡所有的事件Bubble要設為true,讓上層元件可聽到事件,EventMap就是用來集中管理事件的地方,透過EventMap可呼叫要存取的網路服務或Manager,且可使用ResponseAnnouncer回傳訊息給呼叫者,不必再特別調用事件,當然想調用事件也可以,使用Mate的EventAnnouncer,可通知給對事件給感興趣的View。
使用Mate Adapter
除了使用EventAnnouncer及ResponseAnnouncer回應訊息外,還可透過ModelManager自動更新給View,這裡就要用到Flex的強項:DataBinding,我們可在程式初始時挷定View跟ModelManager的Bindable資料(例如ArrayCollection),在透過EventMap改變ModelManager時,由於是DataBinding,我們可不用送事件給View,Binding會自動送PropertyChange事件,一些Flex元件(像DataGrid)會自己更新,簡化了原本MVC煩雜的訊息溝通,這也是使用Mate的好處。
第一部分先簡單介紹架構與流程,下一篇會使用範例來說明,如果大家對Mate的流程感興趣,可參考Kenshin's Flex Blog的Mate教學
Mate官網:http://mate.asfusion.com/
Gaia Frameowrk
Gaia是給Flash開發的Framework,不像PureMVC或Cairngorm的MVC架構(Model、View、Controller),反是提供Flash骨架生成,可快速製作Flash-base網站,利用site.xml管理所有頁面及架構,條列清楚且容易修改,且直接支援SWFAddress、SWFObject,能自動生成deeplink及SEO(Search Engine Optimization),對常接觸Flash網站開發的設計師來說,Gaia絕對是好用的工具。
備註:Gaia是給Flash IDE的擴充元件,需使用Extension Manager安裝,請參考官網教學
Gaia site:http://www.gaiaflashframework.com/
ThunderBolt 輕量級的Logging Framework
上次有介紹過Flex的Logging Framework,這次來介紹ThunderBolt,ThunderBolt是第三方的Logging framework,使用簡單且相容於Flash、Flex及AIR,顯示的方式是透過FireBug(Firefox add-on),在AIR的環境則是透過ThunderBoltAS3Console顯示(AIR檔,可擷取flashlog.txt文件,平常也可以用來追蹤trace),且本身有支援Flex的LoggerTarget,簡單來說,我們能把Flex的TraceTarget換成ThunderBoltTarget,讓Flex Log顯示在FireBug上。
語法請參照:
AS3:http://code.google.com/p/flash-thunderbolt/wiki/ThunderBoltAS3
AS2:http://code.google.com/p/flash-thunderbolt/wiki/ThunderBoltAS2
Google Code:http://code.google.com/p/flash-thunderbolt/
[教學] Flex Logging Framework
介紹一個Flex提供的Logging framework,這是原生的功能,API可在mx.logging下找到,用起來跟trace差不多,最大的不同是Logging有分成以下五層:
- DEBUG:紀錄Flex內部活動。這在應用程式除錯時最為有用
- INFO:紀錄一般資訊
- WARN:當應用程式遇到問題時紀錄訊息。這些問題不造成應用程式停止運作,但可能會導致近一步的錯誤
- ERROR:當重要的服務無法使用,或是限制應用程式的使用的狀況發生時加以紀錄
- FATAL:當導致應用程式失敗的事件發生時加以記錄
愈高層的資訊愈完整,例如WARN就包含WARN、ERROR跟FATAL,而FATAL就只會顯示FATAL
程式範例
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="main();">
<mx:Script>
<![CDATA[
import mx.logging.ILogger;
import mx.logging.Log;
import mx.logging.targets.TraceTarget;
import mx.logging.LogEventLevel;
private function main():void
{
initLogging();
}
private function initLogging():void
{
var logTarget:TraceTarget = new TraceTarget();
var myLogger:ILogger = Log.getLogger("idv.gd.project.MyClass");
var myLogger2:ILogger = Log.getLogger("idv.gd.project.MyClass2");
logTarget.filters = ["idv.gd.project.*"];
//指定要聽 level
logTarget.level = LogEventLevel.ALL;
//開啟顯示資訊
logTarget.includeLevel = true;
logTarget.includeCategory = true;
logTarget.includeDate = true;
logTarget.includeTime = true;
//將Target加入Log
Log.addTarget(logTarget);
//logger送出訊息,由低至高,高層會顯示低層資訊(error: error & fatal)
myLogger.debug("myLogger debug");
myLogger.fatal("myLogger fatal");
myLogger2.info("myLogger2 init");
}
]]>
</mx:Script>
</mx:Application>
首先使用靜態方法取得ILogger,getLogger(Category),Category是用來過濾用,一般的命名原則同package,雖然亂取也可以但自己別搞混了,再來指定要顯示的LogTarget,預設是提供traceTarget,也可自己改寫,像是寫一個能記錄在文字檔或是回傳給伺服器的都行,接著給logTarget指定filter,filter用來過濾要聽的Category Name,預設為全都聽,可用*字元,比較特殊的是Logging會拆解格式,寫idv.gd.project.MyClass就只會聽到MyClass,而idv.gd.project.*則聽的到MyClass、MyClass2,另外,TraceTarget也可指定要顯示的資訊,包含Level、Date、Time、Category,指定完後記得加給Log
最後在要顯示資訊的地方用Logger指定Level即可,可設定要顯示的內容,時間Logging會自動加上
AS3 Performance
之前在7yue's weblog看到的文章,可做為開發時的參考
單元測試:http://www.gskinner.com/blog/archives/2009/04/as3_performance.html
看完的結論就是drawPath跟vector確實可改善效能,而Array則不管型別都一樣慢,不過令人在意的是Static Explicit,在MVC的架構很常用呢