我在 Actionscript3 工作,构建一个类似 MMO 的游戏,我负责 UI 等等。我在很多工作流程中都使用事件,但我的伙伴建议我对我的 UI 资产使用直接函数调用。这是一个例子:
- 我创建了一个ColorChooser类,我们用它来重新着色用户头像的部分。
- 当您单击一种颜色时,ColorChooser会读取单击的像素(色谱图像的)并调度一个事件(ColorChooser.COLOR_CHOSEN)。
- 我的AvatarDesigner类正在监听这个事件。
- 当事件被调度时,AvatarDesigner中的处理程序事件读取(e.target as ColorChooser).chosenColor并将该颜色应用于头像的选定部分。
我的搭档建议我改为:
- 为ColorChooser提供其父AvatarDesigner对象 ( _avatarDesigner ) 的实例。
- 单击颜色时,读取单击的像素 ( var selectedColor:uint ) 并从ColorChooser对象中调用_avatarDesigner.colorAvatar(chosenColor)。
现在,在我的大部分 UI 中,我都在使用事件,这样我就可以将下拉菜单、按钮、文本区域等资产分开并可重复使用。我想我们会将这个 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 最佳实践来判断事件是好是坏,以及为什么。另外,如果有人知道如何在低级别使用事件,我会很高兴。
谢谢阅读!