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

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

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Так и думал, что просто так от этого "лёгкого пути" не откажутся.
Список отображения уже является массивом. Зачем плодить ещё? Всё это будут костыли только ради использования нативного sort. Так код усложнится, потребление памяти и цп вырастет.

Правильным решением будет написать всего одну функцию, в которой реализовать подходящий алгоритм сортировки, с минимальными ресурсозатратами. Она потом на всю жизнь пригодится.
__________________
Дети не должны знать о своих родителях

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
В изометрии ещё бывает, что к y прибавляют x. То есть сортируется как: 1.x + 1.y > 2.x + 2.y Это нужно для того, чтоб объекты стоящие на одинаковой y не "скакали" в списке отображения.

В играх код никогда не был простым.
Самое простое решение это сортировать элементы "каждый с каждым". Но понятное дело, что с такой сортировкой вы сможете показать на экране совсем не много объектов, перед тем как приложение начнёт фризить и виснуть. Поэтому, я дал вам ссылку на вики, где описываются различные алгоритмы сортировок. Нужно прочитать, изучить, выбрать самый оптимальный вариант под свои конкретные нужды и реализовать.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
писок отображения уже является массивом. Зачем плодить ещё?
Затем, что у тебя нет доступа к массиву списка отображения и ты не можешь его сортировать напрямую.

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

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

Создается двумерный массив, в первом массиве хранится индекс массива который определяется по сортируемой величине, второй массив хранит объекты имеющие данную величину. Код примерно следующий

Код AS3:
var container:Sprite = new Sprite(); //допустим это какой-то контейнер в котором нужно сортировать всех детей по Y.
 
var sortChildList:Array = new Array(); //наш двумерный массив со списком отображения
 
//перебираем всех детей и записываем их в массив
var i:int = container.numChildren;
while(i--)
{
    var j:Sprite = container.getChildAt(i);
    if (sortChildList[Math.floor(j.y)] == undefined)
    {
        var na:Array = new Array(j);
        sortChildList[Math.floor(j.y)] = na;
    }
    else
    {
        sortChildList[Math.floor(j.y)].push(j);
    }
}
 
container.removeChildren(); //удаляем всех детей из списка отображения
 
//добавляем всех детей заново
for (i = 0; i < sortChildList.length; i++)
{
    if (sortChilList[i] == undefined) continue;
    for (var j:int = 0; j < sortChilList[i].length; j++)
    {
        container.addChild(sortChilList[i][j]);
    }
}
Опытных гуру прошу оценить и прокомментировать мой способ, есть ли у него преимущества перед сортировочным?
__________________
Я заклинаю вас действовать иначе.


Последний раз редактировалось Bletraut; 03.12.2015 в 18:41.
Старый 03.12.2015, 18:41
ObOs вне форума Посмотреть профиль Отправить личное сообщение для ObOs Найти все сообщения от ObOs
  № 5  
Ответить с цитированием
ObOs
 
Аватар для ObOs

Регистрация: Jul 2009
Сообщений: 149
Код AS3:
container.removeChildren(); //удаляем всех детей из списка отображения
это писать не обязательно.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
я не использовал сортировку дисплей листа ибо это влияет на производительность, но взамен этого я каждый раз генерировал дисплей лист. Мой метод заключался в следующем.
Мм.. ну, как бы тут очевидно, что этот метод гораздо тормознее. Тут происходит то же самое, только 2 раза.
Готов поспорить, что сортировка предложенная callme, будет работать гораздо быстрее

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
и 30 и 100 объектов - это ничто. У меня в игре сортировалось около тысячи объектов при 30 кадрах в секунду. При этом fps не проседал (хотя сортировка у меня была выборочная, алгоритм ниже), учитывая даже то, что там еще и постоянное взаимодействие с сервером и бокс2д (который, как известно, довольно тупой)
Игрушка браузерная. Для мобил могут быть затупы при таких объемах как у меня. Но если использовать старлинг, то у него есть уже встроенный метод sortChildren(), который работает довольно быстро

Код AS3:
children.sortOn("y", Array.NUMERIC);
i = children.length;
while (i--) {
	var childIndex:int = _container.getChildIndex(children[i]);
	if (childIndex != i) {
		_container.setChildIndex(children[i], i);
	}
}
А сам массив children, как я уже говрил, собирается при переопределении методов addChild() / removeChild()

Старый 04.12.2015, 12:12
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 8  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от caseyryan Посмотреть сообщение
и 30 и 100 объектов - это ничто.

Только хотел спросить, может лучше писать:
Код AS3:
_container.setChildIndex(children[i], i);
вместо
Код AS3:
 addChild(clips[i]);
?

Вот еще нашел в сети называется - Z-последовательность

Код AS3:
 
function sortZ(){
    var arrayOfStuff:Vector<DisplayObject> = new Vector<DisplayObject>();
 
    var i:int;
    for(i=0;i<foreground.numChildren;i++){
        arrayOfStuff.push(foreground.getChildAt(i));
    }
 
    arrayOfStuff.sort(sortArrayByY);
 
    for(i=0;i<arrayOfStuff.length;i++){
        foreground.setChildIndex(arrayOfStuff[i],i);
    }
}
 
function sortArrayByY(valA:DisplayObject, valB:DisplayObject):int {
    if(valA.y == valB.y) return 0;
    if(valA.y > valB.y) return 1;
    return -1;
}
Как насчет использовать вектор? Он же быстрее чем Array?

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

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
и 30 и 100 объектов - это ничто.
Согласен, на таких объемах париться не стоит.
__________________
Я заклинаю вас действовать иначе.

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

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

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


 


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


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