Проблемы с производительностью процессора с помощью Flash-анимации - PullRequest
0 голосов
/ 24 июня 2010

Ну, у меня чертовски много времени пыталось снизить производительность моего процессора до 45% при запуске моего текущего приложения.Я попробовал всевозможные приемы и советы по оптимизации с небольшим успехом, и сейчас я нахожусь в точке, где мне нужен принципиально иной подход.

Проблема и текущий подход

В основном видемоего приложения у меня есть один обработчик enterframe.У меня частота кадров ниже 10 кадров в секунду.Этот обработчик уведомляет 16 отдельных фрагментов ролика, чтобы нарисовать клинья с разными углами, используя класс клина Ли Бримелоу .

Итак, 16 раз в каждом enterframe у меня 16 графических фрагментов ролика, очищенных, начало заполненияdraw wedge, endfill - все координируется моим единственным обработчиком enterframe.

Это приводит к увеличению моего процессора до 40-50%: o

Возможная альтернатива?

У меня была идея, что у меня будет только видеоклип длиной 360 кадров и раскрывающие сегменты круга с использованием маски, но я не аниматор и не знаю, как сделать такую ​​маску.

Вопрос

Итак, я думаю, мой метод просто не собирается его сокращать.Кто-нибудь может предложить лучший метод для достижения моей цели?

Я не вижу, как рисование 16 клиньев на кадр = такой высокий процессор, поэтому я должен что-то делать в корне неправильно.

Есть идеи?

ОСНОВНАЯ ФУНКЦИЯ СОБЫТИЯ

private function updatePadProgress(e:Event):void
        {

            viewStackContainer.remixscreen.padUIManager.updatePadArcs2(this.model.audioEngine._channels)
        }

Цикл по всем кругам Проходные значения

public function updatePadArcs2(channels:Vector.<Channel>):void
        {
            var pc:PadContainer;
            var input:Input
            var c:int=0;
            var p:int=0;
            var pct:Number;
            var cc:Channel
            var position:int=0
            var len:int=0


            for (var i:int=0; i < pads.length; ++i)
            {
                pc=pads[i];
                c=pc.channelassign;
                p=pc.padassign;

                input=channels[c].inputs[p];

                if (input.currentState == Input.ACTIVE)
                {

                    position=input.inputAudio.samples.position
                    len=input.inputAudio.samples.length
                    pct= position/len 
                    pc.drawProgress(pct)

                }

            }


        }

Функция рисования

public function drawProgress(pct:Number):void
        {
            pad.drawOn.graphics.clear()
            pad.drawOn.graphics.beginFill(0x000000)
            Wedge.draw(pad.drawOn,0,0,10,360,0)
            pad.drawOn.graphics.endFill()
        }

Ответы [ 2 ]

1 голос
/ 24 июня 2010

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

Это опустило мой процессор до 20%

0 голосов
/ 24 июня 2010

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

edit: код для рисования клиньев выглядит хорошо. Рисование тысяч линий не должно сильно повлиять на производительность. Однако заполнение больших площадей возможно. Если вы попадаете на один и тот же пиксель 16 раз, есть вероятность, что он на самом деле нарисован 16 раз (оптимизация рисования произвольных фигур не так очевидна).

Greetz
back2dos

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