我正在使用Actionscript3,構建一個類似MMO的遊戲,我負責UI等等。我在很多工作流中使用了事件,但我的合作伙伴建議我改用直接函數調用我的UI資源。這裏有一個例子:我應該在這裏使用直接函數調用而不是事件處理程序嗎?
- 我創建了我們使用重新上色用戶的虛擬形象的主要部分的ColorChooser類。
- 當你點擊一個顏色,ColorChooser讀取(彩色光譜圖像的)像素點擊和調度一個事件(ColorChooser.COLOR_CHOSEN)。
- 我的AvatarDesigner class正在監聽這個事件。
- 當事件被分派,處理程序事件AvatarDesigner讀取(e.target爲ColorChooser).chosenColor並應用色彩化身的選定部分。
我的合作者暗示,而不是我:
- 給ColorChooser其父AvatarDesigner對象(_avatarDesigner)的實例。
- 當點擊一種顏色,讀取的像素點擊(VAR chosenColor:UINT)和呼叫_avatarDesigner.colorAvatar(chosenColor)從ColorChooser對象內。
現在,我的大部分用戶界面都使用事件,這樣我就可以將下拉菜單,按鈕,textareas等資源分離並重復使用。我想我們會將這個ColorChooser對象用於其他事物(ObjectDesigner,WallpaperDesigner,BuildingDesigner)。他說,這將會是更好的每我用它別的時間內ColorChooser添加一個條件,因此,或許這樣的:
private function colorClicked(e:MouseEvent):void {
var chosenColor:uint = *the color chosen (bitmapdata.getpixel());*
switch(parent){
case AvatarDesigner: (parent as AvatarDesigner).colorChosen(chosenColor);
break;
case ObjectDesigner: (parent as ObjectDesigner).colorChosen(chosenColor);
break;
case WallpaperDesigner: (parent as WallpaperDesigner).colorChosen(chosenColor);
break;
case BuildingDesigner: (parent as BuildingDesigner).colorChosen(chosenColor);
break;
}
}
或者類似的東西(也許不是檢查父,檢查字符串「類型「在構造函數或其他)。這對我來說似乎很奇怪,因爲我不得不重新加入一個案例,每次在別的地方使用。而事件可以觸發它的事件,並且無論它的父母是什麼,它都可以處理或不處理事件。他的一些推理是:
- 活動應該只用於異步事件或輸入(鼠標,鍵盤)
- 調度事件和監聽器佔用較多的CPU
- 直接函數調用的速度更快,因爲它的一部分當前線程,而不是派遣和處理在時間略有不同
- 的ActionScript3和Away3D中(用於3D)永遠不要使用事件以這種方式
而我覺得事件適當的理由,如:
- 允許對象保持完全獨立於他們的父母使他們更可重用
- 我不認爲分派的事件和聽衆佔用更多的CPU(如因爲任何給定的Sprite正在調度在像ENTER_FRAME,MOUSE_OUT,ADDED_TO_STAGE)任何給定的時間很多事件沒有看到性能命中
- 輕微異步並不重要,如果順序相關的任務發生在聽者的dispatchEvent
- Away3D中後以這種方式使用它們,我認爲,在挖掘它們的API之後,有點。
任何人都可以對此有所瞭解嗎?每當我在不同類型的父代中使用此資產時,是否可能在新的邏輯條件下進行硬編碼,比如說「ShinyButton」?即使事件和聽衆正在使用CPU,也不會添加這樣的條件使它有點意大利麪呢?
另外,對於我的生活,我無法找到Actionscript3最佳實踐,以便事件好壞,以及爲什麼。另外,如果有人知道事件是如何在低級別上使用的,我很樂意。
感謝您的閱讀!
你是對的,你的朋友在說廢話。他的方法所帶來的任何性能提升都可以忽略不計,正如你所預料的那樣,當你想重新使用你的組件時,緊密耦合將成爲一個問題。 –
感謝您的輸入,net.uk.sweet – Prodikl
最佳實踐的一個很好的參考可能是查看Flex框架中的一些組件的結構。您會發現事件大量用於避免不同組件的緊密耦合。如果你發現類似於你朋友的建議switch語句,那麼我會感到驚訝;) –