|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2008
Сообщений: 102
|
addEentListener и несколько циклов for (нагружает ЦП)
Всем привет. Такой вопрос. У меня есть дублирующиеся объект1 и дублирующиеся объект2, есть обработчик собитий ENTER_FRAME, через 2 цикла for (1 цикл для дублирующих объектов1 и 2 цикл для дублирующих объектов2) для определения столкновения, но данный метод тормозит систему (нагружает ЦП).
Есть ли какой-то другой способ определения столкновения для двух разных дублирующихся клипов ? |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
покажите код
|
|
|||||
Регистрация: Sep 2008
Сообщений: 102
|
Я заметил, что при дублировании мувиклипа, я его добавляю в массив, то есть myArr.push(par).
Если через ENTER_FRAME дублируется много мувиклипов, то начинаются почти сразу же жесткие лаги. То есть после добавления мувиклипа через addChild(par), ниже я прописываю myArr.push(par) Хотя утечки памяти не наблюдается. Вот простой пример моей механики: import flash.display.MovieClip; var myArr:Array = []; abc.startDrag(true); var mymc:MovieClip = new MovieClip(); addChild(mymc); init(); function init() { for (var i=0; i<25; i++) { var par:Particle = new Particle(); par.x = Math.random() * stage.stageWidth; par.y = Math.random() * stage.stageHeight; mymc.addChildAt(par,0); myArr.push(par); } this.addEventListener(Event.ENTER_FRAME, hitTes); } function hitTes(e:Event):void { for (var j=0; j<myArr.length; j++) { if (abc.hitTestObject(myArr[j])) { if (myArr[j].parent) { myArr[j].parent.removeChild(myArr[j]); } } } } С памятью все нормально, а вот ЦП начинает кушать ого-го Пример кода: function startFire(evt: Event): void { bullet = new Bullet(); mymc.addChildAt(bullet,0); myArr.push(bullet); // Добавляем пули в массив - ЗАПИСЬ В МАССИВ СИЛЬНО ЗАГРУЖАЕТ ЦП bullet.rotation = soldier.rotation + Math.random() * 20; bullet.x = soldier.x + Math.cos(bullet.rotation * Math.PI / 180) * 25; bullet.y = soldier.y + Math.sin(bullet.rotation * Math.PI / 180) * 25; bullet.addEventListener(Event.ENTER_FRAME, bulletFire, false, 0, true); } } Последний раз редактировалось sersir; 23.02.2015 в 04:39. |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Этот код не должен тормозить. Выложите fla файл.
|
|
|||||
Причина лагов, скорее всего, в одновременной отрисовке множества векторных объектов. Почитайте про растеризацию и кеширование графики. Напр здесь http://www.ant-karlov.ru/iz-vektora-v-rastr.html
|
|
|||||
Регистрация: Sep 2008
Сообщений: 102
|
В том-то и дело, что проблема в другом. Если убрать запись в массивы, то нормально все работает.
|
|
|||||
Регистрация: Sep 2008
Сообщений: 102
|
Прикрепил исходники, посмотрите пожалуйста
|
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
function bulletFire(e: Event): void { var bullet: Sprite = e.currentTarget as Sprite; bullet.x += Math.cos(bullet.rotation * Math.PI / 180) * bulletspeed; bullet.y += Math.sin(bullet.rotation * Math.PI / 180) * bulletspeed; for (var j = 0; j < myArr.length; j++) { //Для пуль Проверяй только столкновение пули, которую ты сейчас подвинул. Она у тебя лежит в переменной bullet. Добавлено через 11 минут Создание объектов нагружает процессор и память. Создавай пулю только если нажата клавиша мыши вместо |
|
|||||
Регистрация: Sep 2008
Сообщений: 102
|
callme, большое спасибо, все отлично работает! То есть желательно обходить двоичные циклы ?
|
|
|||||
Желательно выбрасывать ненужные операции, сократив код до фактического минимума.
Добавлено через 35 секунд Оптимизация этому название. Добавлено через 2 минуты Смена более ресурсоёмких операций на менее ресурсоёмкие с минимум потерь в результате.
__________________
There is no thing in this world that is not simple. |
Часовой пояс GMT +4, время: 10:41. |
|
« Предыдущая тема | Следующая тема » |
|
|