![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 66
|
Столкнулся с проблемой - собственно тормозами... делаю проект, в котором на фоне падают монеты.
так вот: в среднем их одновременно на экране - около 20, ну плюс минус, но при этом возникают заметные глазу подтормаживания((( Собственно, я поискал советов по оптимизации, и парочку использовал... дело несколько улучшилось, но подвисания пока слишком заметны. эксперементальным путем установил, что они именно из-за этого элемента программы((( Реализую я все это дело следующим образом -есть функция droping(), отвечающая за выброс монет. и функция moving() отвечающая за их падения. первая вызывается с помощью setInterval с периодом = 350 - на практике показалось что он работает лучше таймера(вроде бы) ну а moving -из слушателя события enterFrame. вот. плюс положение и параметры монетки определяются с использованием math.random(), который вроде прожорливый, как говорят. выглядит все это следующим образом: 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. Причина: неинформативное название |
|
|||||
|
Вы бы выложили swf-ку, может у вас там графика навороченная, которая все и тормозит. Код, на мой взгляд, тормозным не выглядит. Можно "оптимизировать" функцию moving так:
// Создать ссылку на клип, чтобы всякий раз не искать в массиве по индексу. 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); } } |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
А Вы монеты всегда новые создаёте?
|
|
|||||
|
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Поддерживаю bav. Можно ещё массивы на векторы поменять.
И ещё смысл вот этого не совсем понятен: |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 66
|
Цитата:
------------------------- про вектор - спасибо ... надо попробовать) ------------------------------- монеты - да, всегда новые. когда падают ниже "плинтуса" - удаляю. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
На сколько мне известно, а это очень мало, то при анимации нужно исключать - создание объектов ( зачем их создавать во время анимации, если можно создать заранее и ещё было бы хорошо, если их не удалять, а использовать повторно), обращение к свойствам ( это x, y и прочее, если происходит в одном методе происходит много операций с координатой объекта, то лучше один раз её сохранить в локальной переменной ), обращениее через динамические скобки и потеря фокуса во время итераций. Больше я вроде не знаю.
|
|
|||||
|
а почему бы вам это через EnterFrame не сделать?
код действительно тормозным не выглядит. |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 66
|
хмммм.... попробовал использовать вектор место массива.... в локальной версии работает... загружаю в контач (приложенька для контача планируется) - белый экран О.о
версия плейера - 10.3, выше не могу - ругаются используемые мной библиотеки. Добавлено через 2 минуты Цитата:
в каком смысле? moving и вызвается по enterframe-у. а дропать монетки можно и лучше реже - визуально разницы нет, а вроде как разгружается процессор ) |
|
|||||
|
почему бы монетке самой не падать, а достигая дна не переносится вверх и падать опять с новыми параметрами (скорости, размерами)? Это же просто дождик/снег с него многие начинали.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вектор на двадцать объектов может и в обратную сказаться.. Плюсов он не даст.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 01:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|