Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Движение группы объектов. вопрос по оптимизации! (http://www.flasher.ru/forum/showthread.php?t=206357)

pall92 29.01.2014 22:58

Движение группы объектов. вопрос по оптимизации!
 
Столкнулся с проблемой - собственно тормозами... делаю проект, в котором на фоне падают монеты.
так вот: в среднем их одновременно на экране - около 20, ну плюс минус, но при этом возникают заметные глазу подтормаживания((( Собственно, я поискал советов по оптимизации, и парочку использовал... дело несколько улучшилось, но подвисания пока слишком заметны. эксперементальным путем установил, что они именно из-за этого элемента программы(((

Реализую я все это дело следующим образом -есть функция droping(), отвечающая за выброс монет. и функция moving() отвечающая за их падения.

первая вызывается с помощью setInterval с периодом = 350 - на практике показалось что он работает лучше таймера(вроде бы)

ну а moving -из слушателя события enterFrame.

вот. плюс положение и параметры монетки определяются с использованием math.random(), который вроде прожорливый, как говорят.

выглядит все это следующим образом:
Код AS3:

package Src {
        import flash.display.MovieClip;
        import flash.events.TimerEvent;
        import flash.events.Event;
 
        public class FallingBack extends MovieClip{
 
                //static parameters:
                static var maxDrop = 2;
                public static var addFB:Number=0;
                static var arr:Array = new Array();
                static var level = 1;
                static var nominals:Array = new Array(1,10,100,500);
                static var freq:int;
 
                static var speed:int=5;
                static var angSpeed:int = 5;
 
                var realSpeed:int;
                var realAS:int;
                //static var
                public static function droping(e=null):void
                {
 
                        //Main.THIS.ltx.text = String(arr.length);
                        //addFB = 2;
//если набралось больше одной монетки для сбрасывания, но их не больше чем критическое кол-во:
                        if(addFB >= 1 && arr.length < 26)
                        {
 
                                var t:FallingBack;
 
                                freq = int(addFB);
                                if(freq> maxDrop) freq = maxDrop;
                                //c = freqs[level];
 
 
                        //так я определяют номинал монетки
                                var nom:int;
                                for(var i:int=0; i< freq; i++)
                                {
                                        if(addFB >= 10000)
                                        {
                                                nom=6;
                                                addFB -= 10000;
                                        }
                                        else if(addFB>= 5000)
                                        {
                                                nom=5;
                                                addFB -= 1000;
                                        }
                                        else if(addFB>= 1000)
                                        {
                                                addFB -= 500;
                                                nom =4;
                                        }
                                        else if(addFB>= 500)
                                        {
                                                addFB -= 100;
                                                nom=3;
                                        }
                                        else if(addFB>= 100)
                                        {
                                                addFB -= 10;
                                                nom=2;
                                        }
                                        else
                                        {
                                                addFB --;
                                                nom=1;
                                        }
                                        t = new FallingBack(nom);
                                        Main.THIS.FB_mc.addChild(t);
                                }
 
 
                        }
 
 
                }
                public static function moving():void
                {
                        var L:int = arr.length;//обходим все созданные монетки
                        for (var key:int=L-1; key>=0; key--)
                        {
                                arr[key].mov();//двигаем с учетом персональных угловой и линейной скоростей
                                if(arr[key].y>800)
                                {
 
                                        Main.THIS.FB_mc.removeChild(arr[key]);
 
                                        arr.splice(key,1);
 
 
                                }
                        }
                }
                function mov():void
                {
                        y+= realSpeed;
                        rotation += realAS;
                }
                public function FallingBack(t:int) {
 
 
                        //определяем стартовое положение и скорости
                        gotoAndStop(t);
                        x=int(Math.random()*610)+ 110;
                        y=100;
                        //rotation = int(Math.random()*360);
                        arr.push(this);
 
                        realSpeed = speed+ int(10*Math.random());
                        //trace('speed='+realSpeed);
                        realAS = int(Math.random()*angSpeed) - angSpeed/2;
                }
 
        }
 
}


Вот. Вопрос - реально ли как-то реализовать обход 20-30ти объектов и их перемещение без чертовых тормозов? Собственно не так. Я видел, что реально... но КАК?

Буду рад любому совету, спасибо)

ps: fps= 24, имеет ли это значение вообще?

bav 29.01.2014 23:26

Вы бы выложили swf-ку, может у вас там графика навороченная, которая все и тормозит. Код, на мой взгляд, тормозным не выглядит. Можно "оптимизировать" функцию moving так:
Код AS3:

// Создать ссылку на клип, чтобы всякий раз не искать в массиве по индексу.
var clip:FallingBack;
for (var key:int=L-1; key>=0; key--)
{
        clip = arr[key] as FallingBack;
        clip.mov();//двигаем с учетом персональных угловой и линейной скоростей
        if(clip.y>800)
        {
                Main.THIS.FB_mc.removeChild(clip);
                arr.splice(key,1);
        }
}


Akopalipsis 29.01.2014 23:35

А Вы монеты всегда новые создаёте?

illuzor 29.01.2014 23:38

Поддерживаю bav. Можно ещё массивы на векторы поменять.
И ещё смысл вот этого не совсем понятен:
Код AS3:

arr.push(this);


pall92 30.01.2014 00:06

Цитата:

Сообщение от illuzor (Сообщение 1158414)
Поддерживаю bav. Можно ещё массивы на векторы поменять.
И ещё смысл вот этого не совсем понятен:
Код AS3:

arr.push(this);


ну эта строчка добавляет монетку в массив.. как иначе она там появится то?)

-------------------------
про вектор - спасибо ... надо попробовать)
-------------------------------

монеты - да, всегда новые. когда падают ниже "плинтуса" - удаляю.

Akopalipsis 30.01.2014 00:11

На сколько мне известно, а это очень мало, то при анимации нужно исключать - создание объектов ( зачем их создавать во время анимации, если можно создать заранее и ещё было бы хорошо, если их не удалять, а использовать повторно), обращение к свойствам ( это x, y и прочее, если происходит в одном методе происходит много операций с координатой объекта, то лучше один раз её сохранить в локальной переменной ), обращениее через динамические скобки и потеря фокуса во время итераций. Больше я вроде не знаю.

Bletraut 30.01.2014 00:11

а почему бы вам это через EnterFrame не сделать?

код действительно тормозным не выглядит.

pall92 30.01.2014 00:13

хмммм.... попробовал использовать вектор место массива.... в локальной версии работает... загружаю в контач (приложенька для контача планируется) - белый экран О.о

версия плейера - 10.3, выше не могу - ругаются используемые мной библиотеки.

Добавлено через 2 минуты
Цитата:

Сообщение от Bletraut (Сообщение 1158419)
а почему бы вам это через EnterFrame не сделать?

код действительно тормозным не выглядит.


в каком смысле? moving и вызвается по enterframe-у. а дропать монетки можно и лучше реже - визуально разницы нет, а вроде как разгружается процессор )

GBee 30.01.2014 00:16

почему бы монетке самой не падать, а достигая дна не переносится вверх и падать опять с новыми параметрами (скорости, размерами)? Это же просто дождик/снег с него многие начинали.

Akopalipsis 30.01.2014 00:16

Вектор на двадцать объектов может и в обратную сказаться.. Плюсов он не даст.


Часовой пояс GMT +4, время: 20:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.