【问题标题】:ActionScript - Serious Performance Problem Using TweenLite & Mouse Move EventActionScript - 使用 TweenLite 和鼠标移动事件的严重性能问题
【发布时间】:2011-03-04 22:01:38
【问题描述】:

在拖动时使用 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;
    }

我知道 TweenLite 有一个 Drop Shadow Plusing,但它只能对滤镜进行补间,而不是更改始终可见的投影的距离或模糊量。

另外,我不是在手机上测试这个,我在我的快速桌面上测试 Flash CS5 和外部调试器 - 两者都落后于显示对象,它只是一个简单的方形,即使在之后zoomTween 已完成。

有什么想法吗?

【问题讨论】:

    标签: actionscript-3 events mouse drag gsap


    【解决方案1】:

    您在每次 mousemove 更新时都实例化一个新的 TweenLite。您可能会在单个 enter_frame 间隔的空间内发生数十个此类事件。这可能是 lot 的 TweenLite 实例,它们都试图同时移动同一个对象一秒钟。只需“短”鼠标移动就可以考虑数百个。数千个扩展动作。

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

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

    【讨论】:

    • 好的,我知道调用所有那些 TweenLite 实例 - 不知道为什么我没有看到。但是鼠标移动事件不是像输入帧事件那样繁重吗?
    • 不,他们更糟糕。您可以在单个帧的空间中发生多个 mouse_move 事件。通常是一打。还要考虑 MouseEvents 都冒泡,所以这几十个事件也都在显示列表中冒泡。停止传播可能会有所帮助,但主要是只有在捕获阶段而不是冒泡阶段才这样做。作为一个实验,在 swf 根上设置 mouseEnabled = mouseChildren = false 并尝试在没有鼠标事件处理程序的复杂 swf 上滑动手指。现在启用鼠标事件并重试。现在使用处理程序。
    • 这是为了说明即使您不监听鼠标事件或对鼠标事件不做任何事情,它们仍然会对 Flash Player 产生负担。添加处理程序会使情况变得更糟。
    • 感谢您澄清这一点。很高兴知道,特别是因为我假设因为我没有使用任何鼠标移动不会伤害的输入帧事件。您能否详细说明为什么过滤器在移动设备上很困难?我一直明白,将矢量缓存为位图有助于提高性能,将位图过滤器添加到显示对象会自动将它们缓存为位图。
    • 应用过滤器的操作计算量很大,因为它可能需要对位图中的所有像素进行多次传递,并且确实可以增加显示对象的尺寸(从而扩大图像的大小在记忆中)。此外,不好将具有多个帧的动画剪辑缓存为位图,每个帧都有不同的艺术作品,因为每帧更新都必须重新缓存艺术作品,增加了在帧期间执行的代码的开销更新。
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 2021-05-17
    • 2013-04-22
    • 1970-01-01
    • 2020-08-29
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多