0

使用 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 之后完全的。

有任何想法吗?

4

1 回答 1

1

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

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

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

于 2011-03-04T22:07:44.347 回答