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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.02.2015, 21:46
sersir вне форума Посмотреть профиль Отправить личное сообщение для sersir Найти все сообщения от sersir
  № 1  
Ответить с цитированием
sersir
 
Аватар для sersir

Регистрация: Sep 2008
Сообщений: 102
По умолчанию addEentListener и несколько циклов for (нагружает ЦП)

Всем привет. Такой вопрос. У меня есть дублирующиеся объект1 и дублирующиеся объект2, есть обработчик собитий ENTER_FRAME, через 2 цикла for (1 цикл для дублирующих объектов1 и 2 цикл для дублирующих объектов2) для определения столкновения, но данный метод тормозит систему (нагружает ЦП).

Есть ли какой-то другой способ определения столкновения для двух разных дублирующихся клипов ?

Старый 22.02.2015, 22:14
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 2  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
покажите код

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

Регистрация: Sep 2008
Сообщений: 102
Я заметил, что при дублировании мувиклипа, я его добавляю в массив, то есть myArr.push(par).

Если через ENTER_FRAME дублируется много мувиклипов, то начинаются почти сразу же жесткие лаги.

То есть после добавления мувиклипа через addChild(par), ниже я прописываю myArr.push(par)

Хотя утечки памяти не наблюдается.

Вот простой пример моей механики:

Код AS3:
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]);
            }
 
        }
    }
}
Добавлено через 16 минут
С памятью все нормально, а вот ЦП начинает кушать ого-го

Пример кода:

Код AS3:
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.
Старый 23.02.2015, 10:30
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 4  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
Этот код не должен тормозить. Выложите fla файл.

Старый 23.02.2015, 10:49
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 5  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Причина лагов, скорее всего, в одновременной отрисовке множества векторных объектов. Почитайте про растеризацию и кеширование графики. Напр здесь http://www.ant-karlov.ru/iz-vektora-v-rastr.html

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

Регистрация: Sep 2008
Сообщений: 102
В том-то и дело, что проблема в другом. Если убрать запись в массивы, то нормально все работает.

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

Регистрация: Sep 2008
Сообщений: 102
Прикрепил исходники, посмотрите пожалуйста
Вложения
Тип файла: rar Desktop.rar (1.45 Мб, 13 просмотров)

Старый 23.02.2015, 17:05
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 8  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
Код AS3:
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.
Код AS3:
var bullet: Sprite = e.currentTarget as Sprite;
Добавлено через 11 минут
Создание объектов нагружает процессор и память.

Создавай пулю только если нажата клавиша мыши

Код AS3:
function Fire(evt: Event): void {
	if (fire == true) {
		var bullet: Sprite = new Bullet();
вместо
Код AS3:
function Fire(evt: Event): void {
var bullet: Sprite = new Bullet();
	if (fire == true) {

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

Регистрация: Sep 2008
Сообщений: 102
callme, большое спасибо, все отлично работает! То есть желательно обходить двоичные циклы ?

Старый 23.02.2015, 20:43
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 10  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Желательно выбрасывать ненужные операции, сократив код до фактического минимума.

Добавлено через 35 секунд
Оптимизация этому название.

Добавлено через 2 минуты
Смена более ресурсоёмких операций на менее ресурсоёмкие с минимум потерь в результате.
__________________
There is no thing in this world that is not simple.

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

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

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


 


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


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