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

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Подскажите эффективный способ упорядочения объектов в контейнере

Задача стандартная. Есть containerObjects, в котором порядка 10-40 объектов. В общем случае все они могут двигаться.

По таймеру вызываем функцию, которая заменяет индексы у объектов containerObjects в соответствии с их позицией y (чем больше y - тем больше индекс).

Вариант 1 я сделал с массивом, но он мне реально не понравился, поскольку вылезли тормоза:

Код AS3:
	var objectsList:Array = new Array();
	for(var i:int=0;i<containerObjects.numChildren;i++) {
		var currObj:Object = containerObjects.getChildAt(i);
		var objectY:int = currObj.y;
		objectsList.push({object:currObj, objY:objectY});
	}			
	objectsList.sortOn(["objY"]);
	for(var i = 0; i < objectsList.length; i++) {
		containerObjects.setChildIndex(object, i);
	}
Потом я еще поэксперементировал со swapChildren (тут в одной из тем было), но тоже получается не очень.

Интересует максимально простое решение.


Последний раз редактировалось mikhailk; 09.12.2009 в 16:23.
Старый 09.12.2009, 16:31
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 2  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
при большом количестве объектов для пересортировки нужно использовать разделение на сетки
кроме того сортировать только те объекты у которых реально поменялись координаты y c прошлой сортировки.
__________________
Отряд Котовскага

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
ну, у меня все-таки не 5000 объектов, к счастью... )))

конкретный пример

10 объектов, индексы упорядочены по возрастанию. Объект с индексом 1 встал перед объектом с индексом 5, а объект с индексом 8 встал за ними обоими. Поменялись координаты у объектов 1 и 8, но сортировать нужно 1, 5 и 8. Это я к тому, что сортировкой только переместившихся не обойтись, наверное.

Старый 09.12.2009, 16:50
bicubic_bublic вне форума Посмотреть профиль Найти все сообщения от bicubic_bublic
  № 4  
Ответить с цитированием
bicubic_bublic
Banned
[+4 25.09.09]
[+1 12.11.09]
[+4 12.12.09]

Регистрация: Sep 2009
Сообщений: 231
сортировка массива. сложность: n * ln(n);
изменение положение одного элемента в упорядоченном массиве: ln(n)

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
это понятно
просто в примере, который я привел, нужно еще выяснить, кто с кем перекрывается. Двигались-то 1-й и 8-й, а упорядочивать нужно 1-й, 5-й и 8-й. Т.е, этого 5-го еще нужно вычислить.

или я неправильно понял?

или так?

1. вычленяем те объекты, которые двигались
2. каждого из них по очереди упорядочиваем в массиве, начиная с того, у которого y меньше и далее по возрастанию


Последний раз редактировалось mikhailk; 09.12.2009 в 17:05.
Старый 09.12.2009, 17:06
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Код AS3:
private function sortChildren(mc:MovieClip):void
{
   var arr:Array = [];
   var num:uint = mc.numChildren;
   var i:uint;
   var chld:MovieClip;
   for (i = 0; i < num; i++)
   {
      chld = mc.getChildAt(i);
      arr.push([chld.y, chld]);
   }
   arr.sort();
   for (i = 0; i < num; i++)
   {
      mc.setChildIndex(arr[i][1], num-1)
   }   
}
честно - не проверял нифига на скорость, но может так будет хоть немного быстрее?
а то как-то у тебя выходит, что для серьезных методов объектов маловато, но несерьезные все равно тормозят =) вот еще один несерьезный... по сути немного модифицированый твой.
__________________
Поймай яблоко 2!

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
ок, проверю потом ))
реализовал уже через swapChildren по каждому двигающемуся объекту.
но теперь приходится тащить признаки перемещения и отслеживать их.

кстати, про оптимизацию, где-то проскакивало, что еще while(i--) работает быстрее, чем for(i...

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Для 40 объектов - как могут быть тормоза? =)
Попробуйте изначально все объекты пихать в массив (при создании) - тогда Вам не нужно будет при каждой сортировке создавать новый массив из дисплей листа.
__________________
...вселенская грусть

Старый 10.12.2009, 11:45
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 9  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
вот у меня (для теста) 50 персов двигаются. При каждом движении (перерисовка по таймеру раз в 10 мс - тоже для теста, в реале можно увеличить) идёт пересчёт глубины для поменявших позицию y.
Тормоза, в принципе, заметны когда двигаются все 50, хотя не совсем ясно в чём дело: или в сортировке или в отрисовке (хотя отрисовка идёт постоянно, даже для стоящих на месте)
примерчик (1.5. Мб)
ps: глюкает хост (временно недоступен)
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 10.12.2009 в 11:48.
Старый 10.12.2009, 18:48
derhab вне форума Посмотреть профиль Отправить личное сообщение для derhab Найти все сообщения от derhab
  № 10  
Ответить с цитированием
derhab
 
Аватар для derhab

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
метод в классе контейнера детей которого нужно сортировать, list - список всех объектов подлежащих сортировке...они туда сразу после добавления на сцену заносятся
Код AS3:
public function zSort():void
{	
	list.sortOn('y', Array.NUMERIC);
	var l:int = list.length;
 
	while (l--) {
		var o:DisplayObject = list[l] as DisplayObject;
		if (getChildAt(l) != o) setChildIndex(o, l);
	}
}
Цитата:
хотя не совсем ясно в чём дело: или в сортировке или в отрисовке
так отключи сортировку и станет ясно
__________________
freelance | Раздор

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

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

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


 


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


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