0

我在 Actionscript3 工作,构建一个类似 MMO 的游戏,我负责 UI 等等。我在很多工作流程中都使用事件,但我的伙伴建议我对我的 UI 资产使用直接函数调用。这是一个例子:

  1. 我创建了一个ColorChooser类,我们用它来重新着色用户头像的部分。
  2. 当您单击一种颜色时,ColorChooser会读取单击的像素(色谱图像的)并调度一个事件(ColorChooser.COLOR_CHOSEN)。
  3. 我的AvatarDesigner类正在监听这个事件。
  4. 当事件被调度时,AvatarDesigner中的处理程序事件读取(e.target as ColorChooser).chosenColor并将该颜色应用于头像的选定部分。

我的搭档建议我改为:

  1. 为ColorChooser提供其父AvatarDesigner对象 ( _avatarDesigner ) 的实例。
  2. 单击颜色时,读取单击的像素 ( 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 最佳实践来判断事件是好是坏,以及为什么。另外,如果有人知道如何在低级别使用事件,我会很高兴。

谢谢阅读!

4

2 回答 2

3

我认为你的不同意见更多是基于习惯而不是真正的原因。

我会亲自使用个人事件模型,这是我想到的最开放和最灵活的解决方案。

但是,如果您想使用回调函数而无需返回到您的ColorChooser. applyColor”或“choseColor”,而不是形容词或名称,如“colorChosen”,这并不意味着很多)IColorReceiverapplyColor(color:Color){};

然后在您的colorPicked(e:MouseEvent){}方法中确保parent实现了IColorReceiver,并且您在调用applyColor(chosenColor);时没有使用其他测试,而不是使用IColorReceiver. 它也可以与经典继承一起使用,但需要更多代码以降低灵活性。

我不提供代码,但你似乎有一个合理的水平,所以我有信心。;)

(希望我的英语是正确的)

于 2012-12-21T08:35:25.137 回答
1

简短的回答,我认为你是对的,你的朋友是错的。任何感知到的性能提升(如果有的话)都可以忽略不计,并且正如您正确预期的那样,引入的紧耦合将使您的组件难以在其他情况下重用,并使您的项目更难作为一个整体进行维护。

ActionScript 是一种基于事件的异步语言,如果您鼓励他接受它而不是反对它,您将帮助您的朋友!

要回答您关于 ActionScript 3.0 开发最佳实践的问题,我认为您可以比查看 Flex 框架的某些组件的结构做得更糟。这些是由 Adob​​e 工程师开发的,因此可以被视为最佳实践的演示。您会发现大量使用事件来避免不同组件或组件参与者之间的紧密耦合,并尽量减少使用您朋友建议的那种臭代码。

于 2012-12-21T13:47:18.037 回答