ActionScript - серьезная проблема с производительностью при использовании события TweenLite & Mouse Move - PullRequest
0 голосов
/ 05 марта 2011

Я получаю очень заметное снижение производительности при использовании 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, так и во внешнем отладчике - оба отстают от экранного объекта, который представляет собой простую квадратную форму, даже после изменение масштаба завершено.

есть идеи?

1 Ответ

1 голос
/ 05 марта 2011

Вы создаете новый TweenLite при каждом обновлении перемещения мыши. Потенциально вы можете иметь множество таких событий в пределах одного интервала enter_frame. Это потенциально много экземпляров TweenLite, все они пытаются переместить один и тот же объект одновременно в течение одной секунды. Подумайте сотни из них только для "короткого" движения мыши. Тысячи за расширенные движения.

Особенно для мобильных устройств, вам нужно избегать событий перемещения мыши, поскольку они абсолютно заполняют систему. Это перегрузка данных. Возможно, вместо этого вы могли бы отслеживать изменения в дельте с течением времени в обработчике событий enter_frame или timer? Сделайте это, а затем убедитесь, что одновременно существует только один tweenlite (убейте старый или просто дайте старому закончить, прежде чем назначить новый).

Также обратите внимание, что фильтры будут очень тяжелыми для вашего мобильного устройства. Вы можете запустить его на рабочем столе, но я был бы удивлен, если это сработает на мобильном телефоне.

...