2011-03-04 51 views
0

当使用TweenLite在拖动过程中使用TweenLite补间过滤器时,我收到了非常显着的性能提升。ActionScript - 使用TweenLite和鼠标移动事件的严重性能问题

private function mouseMoveEventHandler(evt:MouseEvent):void 
    { 
    evt.stopImmediatePropagation(); 

    startDrag(); 

    zoomTween = new TweenLite(this, 1.0, {dropShadowAmount: ZOOM_SHADOW, scaleX: 1.5, scaleY: 1.5, rotation: 10, onUpdate: updateDropShadow, onComplete: completeDropShadow, onCompleteParams: [ZOOM_SHADOW]}); 

    removeEventListener(MouseEvent.CLICK, mouseClickEventHandler); 
    addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); 
    addEventListener(MouseEvent.MOUSE_OUT, mouseUpEventHandler); 
    } 

private function updateDropShadow():void 
    { 
    filters = [new DropShadowFilter(dropShadowAmount, 90, 0x000000, 1.0, dropShadowAmount * 2, dropShadowAmount * 2, 1.0, 3)]; 
    } 

private function completeDropShadow(dropShadowAmount:Number):void 
    { 
    this.dropShadowAmount = dropShadowAmount; 
    } 

我知道有一个阴影Plusing与TweenLite的,但只需要补间上落过滤器,而不是改变总是可见投影的距离或模糊量的能力。

另外,我没有在手机上测试这个,我在我的快速桌面上测试了Flash CS5和外部调试器 - 两者都比显示对象滞后,这只是一个简单的方形,甚至zoomTween完成后。

有什么想法?

回答

1

你正在实例化一个新的TweenLite每一个mousemove更新。您可能会在单个enter_frame时间间隔内发生数十个这样的情况。这可能是TweenLite实例的批次,所有尝试同时移动同一个对象一秒钟。认为其中的数百只是一个“短”的鼠标移动。数千个用于扩展运动。

对于特别是移动设备,您需要避免mousemove事件,因为它们绝对是泛滥的系统。这是数据超载。也许相反,您可以跟踪enter_frame或timer事件处理程序中随时间变化的delta变化吗?这样做,然后确保一次只存在一个tweenlite(杀掉旧的,或者在分配新的之前让旧的完成)。

另请注意,过滤器在您的移动设备上将非常困难。你可能会在桌面上启动并运行,但如果它在移动设备上运行,我会感到惊讶。

+0

好吧,我明白要调用所有那些TweenLite实例 - 不知道为什么我没有看到。但不是像输入框架事件一样征税的鼠标移动事件? – TheDarkIn1978 2011-03-04 22:13:58

+2

不,他们更糟。您可以在单个帧的空间中发生多个mouse_move事件。典型的是十几个。还要考虑到MouseEvent的所有泡泡,所以这些数十个事件都在冒泡通过显示列表。停止传播可以提供帮助,但大多数情况下只有在捕获阶段而不是气泡阶段时才会有所帮助。作为一个实验,在swf根上设置mouseEnabled = mouseChildren = false,然后尝试用无鼠标事件处理程序在复杂的swf上滑动手指。现在启用鼠标事件并再次尝试。现在使用处理程序。 – scriptocalypse 2011-03-04 22:37:28

+0

这是为了说明,即使您不听或使用鼠标事件做任何事情,他们仍然对Flash Player征税。添加处理程序会使情况更糟。 – scriptocalypse 2011-03-04 22:38:51