Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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. Причина: неинформативное название
Старый 29.01.2014, 23:26
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 2  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Вы бы выложили 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);
	}
}

Старый 29.01.2014, 23:35
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
А Вы монеты всегда новые создаёте?

Старый 29.01.2014, 23:38
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 4  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Поддерживаю bav. Можно ещё массивы на векторы поменять.
И ещё смысл вот этого не совсем понятен:
Код AS3:
arr.push(this);

Старый 30.01.2014, 00:06
pall92 вне форума Посмотреть профиль Отправить личное сообщение для pall92 Найти все сообщения от pall92
  № 5  
Ответить с цитированием
pall92

Регистрация: Jul 2012
Сообщений: 66
Цитата:
Сообщение от illuzor Посмотреть сообщение
Поддерживаю bav. Можно ещё массивы на векторы поменять.
И ещё смысл вот этого не совсем понятен:
Код AS3:
arr.push(this);
ну эта строчка добавляет монетку в массив.. как иначе она там появится то?)

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

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

Старый 30.01.2014, 00:11
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

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

Старый 30.01.2014, 00:11
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 7  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
а почему бы вам это через EnterFrame не сделать?

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

Старый 30.01.2014, 00:13
pall92 вне форума Посмотреть профиль Отправить личное сообщение для pall92 Найти все сообщения от pall92
  № 8  
Ответить с цитированием
pall92

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

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

Добавлено через 2 минуты
Цитата:
Сообщение от Bletraut Посмотреть сообщение
а почему бы вам это через EnterFrame не сделать?

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

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

Старый 30.01.2014, 00:16
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 9  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
почему бы монетке самой не падать, а достигая дна не переносится вверх и падать опять с новыми параметрами (скорости, размерами)? Это же просто дождик/снег с него многие начинали.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 30.01.2014, 00:16
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вектор на двадцать объектов может и в обратную сказаться.. Плюсов он не даст.

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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