Как предотвратить утечки памяти во Flex при повторном запуске эффектов? - PullRequest
0 голосов
/ 09 марта 2012

Это приложение представляет собой значительно упрощенную версию того, что я пытаюсь выполнить, сглаживание некоторых движений на экране с помощью комбинированной анимации и повторный запуск при изменении ситуации, а также использование привязок для установки некоторых значений анимации.,Анимация периодически останавливается, а затем перезапускается.Значение valueFrom не установлено, поэтому значение свойства просто продолжается от того места, где оно было, к новой цели.В этом примере я анимирую левый / верхний элемент Rect в направлении X / Y мыши, чтобы заставить его преследовать мышь.

Проблема в том, что память этого приложения продолжает расти, если вы немного подождете и продолжитепереместите мышь.Так что же мне делать, чем я не являюсь?

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    creationComplete="creationCompleteHandler(event)"
    mouseMove="mouseMoveHandler(event)"
    mouseOut="mouseOutHandler(event)"
    >
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private static const RECT_HALF_SIZE:int = 5;
            private static const NO_CHASE:int = -1000;

            [Bindable]
            private var lastMouseX:int = NO_CHASE;

            [Bindable]
            private var lastMouseY:int = NO_CHASE;

            private var evalTimer:Timer = new Timer(100);

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                evalTimer.addEventListener(TimerEvent.TIMER, function(event:TimerEvent):void { evalChase(); });
                evalTimer.start();
            }

            protected function mouseOutHandler(event:MouseEvent):void
            {
                lastMouseX = lastMouseY = NO_CHASE;
                evalChase();
            }

            protected function mouseMoveHandler(event:MouseEvent):void
            {
                const reStart:Boolean = (lastMouseX == NO_CHASE);

                lastMouseX = event.localX;
                lastMouseY = event.localY;

                if(reStart)
                    evalChase();
            }

            private function evalChase():void
            {
                doChase.stop();
                doChase.end();

                if(lastMouseX == NO_CHASE)
                    return;

                doChase.play();
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:Linear id="linearEaser" />
        <s:Parallel
            id="doChase"
            duration="2000"
            >
            <s:Animate target="{chaser}" easer="{linearEaser}" >
                <s:SimpleMotionPath property="left" valueTo="{lastMouseX-RECT_HALF_SIZE}" />
            </s:Animate>
            <s:Animate  target="{chaser}" easer="{linearEaser}" >
                <s:SimpleMotionPath property="top" valueTo="{lastMouseY-RECT_HALF_SIZE}" />
            </s:Animate>
        </s:Parallel>
    </fx:Declarations>

    <s:Rect
        id="chaser"
        top="0" left="0"
        width="{2*RECT_HALF_SIZE}" height="{2*RECT_HALF_SIZE}"
        >
        <s:fill>
            <s:SolidColor color="red" />
        </s:fill>
    </s:Rect>

</s:WindowedApplication>

1 Ответ

0 голосов
/ 10 марта 2012

Не думайте, что вы на самом деле делаете что-то не так в этом коде, я скопировал в новый проект Flex 4.6 и запустил его, я мог видеть, что вы говорите в отношении самого процесса ADL, немного увеличивающего потребление памятисо временем, особенно после остановки движения, затем начинается снова, однако я попытался запустить это в Flash Builder с помощью профилировщика, и кажется, что сам swf действительно не пропускает память, он остался на уровне около 1,1 МБ (до 1,4)(но потом отступим) кажется, что в памяти было достаточно объектов Vector. <*>, хотя мне не ясно, что хранится в этих объектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...