Показать сообщение отдельно
Старый 29.01.2014, 22:58
pall92 вне форума Посмотреть профиль Отправить личное сообщение для pall92 Найти все сообщения от pall92
  № 1  
Ответить с цитированием
pall92

Регистрация: Jul 2012
Сообщений: 66
По умолчанию Движение группы объектов. вопрос по оптимизации!

Столкнулся с проблемой - собственно тормозами... делаю проект, в котором на фоне падают монеты.
так вот: в среднем их одновременно на экране - около 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, имеет ли это значение вообще?


Последний раз редактировалось pall92; 29.01.2014 в 23:04. Причина: неинформативное название