Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   В чем разница между setChildIndex() и addChildAt() (http://www.flasher.ru/forum/showthread.php?t=174862)

HardCoder 04.02.2012 15:09

В чем разница между setChildIndex() и addChildAt()
 
Здравствуйте. Понятно, что второй метод еще и добавляет обьект в дисплей лист, а первый лишь изменяет глубину. Но, если обьект уже добавлен, и мне нужно 30 раз/сек изменять его глубину, какой из двух вариантов лучше использовать? Что лучше в плане производительности? В справке по этому вопросу ничего не сказано.

Jewelz 04.02.2012 15:11

я думал, что человек, рассказывающий в блоге о создании изометрического мира умеет делать тесты на производительность

PS. setChildIndex побыстрее

Inet_PC 04.02.2012 15:49

Цитата:

я думал, что человек, рассказывающий в блоге о создании изометрического мира умеет делать тесты на производительность
Человек не может знать все и уметь все.
to HardCoder
Вот как раз и стоит научиться замерять производительность.

HardCoder 04.02.2012 18:31

Спасибо, за ответы. Да, я задал вопрос, потому что не умею замерять производительность как следует. Да и "производительность" - понятие растяжимое. По логике, нужно использовать setChildIndex(), так как он для этого и предназначен, addChildAt() предназначен для другого - для добавления обьектов. Но проведя небольшой тест в дебаг плеере, картина получилась следующая:
Цитата:

addChildAt() || setChildIndex()
30 120
60 122
59 119
60 119
59 122
69 120
61 119
60 125
61 119
62 120
61 119
63 119
60 116
Вот код, который я использовал:
Код AS3:

private function init(e:Event = null):void {
        this.removeEventListener(Event.ADDED_TO_STAGE, init);
        mcs = new Array();
        var mc:MC;
        for (var i:uint = 0; i < 2000; i++){
                mc = new MC();
                mcs.push(mc);
                this.addChild(mc);
        }
        this.stage.addEventListener(MouseEvent.CLICK, onClick);
}
 
private function onClick(e:MouseEvent):void {
        var time1:Number = getTimer();
        for (var i:uint = 0; i < mcs.length; i++){
                addChildAt(mcs[i], 0);
        }
        time1 = getTimer() - time1;
        var time2:Number = getTimer();
        for (var j:uint = 0; j < mcs.length; j++){
                setChildIndex(mcs[j], 0);
        }
        time2 = getTimer() - time2;
        trace(time1, time2);
}

Вот и решил спросить у более опытных.

Dukobpa3 04.02.2012 18:49

setChildIndex еще пчку проверок валидности такого действия проводит. Как минимум есть ли такой объект в данном паренте. А addChildAt втупую добавляет объект и всё.

Сортировка аддчилдами самая быстрая, да ты собственно и сам на своем тесте увидал уже. Правда я не уверен что индекс 0 для теста самый удачный, рандомных бы каких-то напихал. А то думаю [ноль] и [numChildren - 1] как-то иначе обрабатываются по ускоренной схеме.

Добавлено через 1 минуту
Ну и тайм 30 милисекунд не совсем ок. Добавь туда еще один нолик хотя бы в кол-во объектов, а то таймер может врать на маленьких цифрах.

Jewelz 04.02.2012 18:51

при [numChildren - 1] быстрее setChildIndex, но не на много

а вообще получается, что зависимость от кол-ва детей и индекса куда хотим запихнуть

HardCoder 04.02.2012 19:20

Цитата:

Ну и тайм 30 милисекунд не совсем ок. Добавь туда еще один нолик хотя бы в кол-во объектов, а то таймер может врать на маленьких цифрах.
Не могу :). Мой "Катерпиллер" идет на взлет. Установил количество обьектов 4000. Вот результаты, которые у меня получились:
Когда все обьекты помещаем на 0-вой индекс:
Цитата:

addChildAt() || setChildIndex()
298 3158
1575 3044
1585 3034
1552 3014
1536 3018
1539 3007
1537 3112
1534 2991
1536 3013
1536 3038
Случайное число от 1 до mcs.length -2 (одинаковое для обоих методов):
Цитата:

addChildAt() || setChildIndex()
274 2095
949 1723
657 1096
744 1882
994 2784
835 1462
605 999
619 852
595 1442
787 2527
mcs.length -1:
Цитата:

addChildAt() || setChildIndex()
1522 1576
1526 1545
1547 1541
1516 1547
1553 1527
1532 1529
1514 1550
1542 1517
1527 1523
1527 1561
Добавлено через 1 минуту
Действительно, при [numChildren - 1] результаты почти одинаковые.

Добавлено через 5 минут
Вот и опять вопрос по главной теме. Если setChildIndex хорош лишь при индексе [numChildren - 1], то в чем его полезность?

Jewelz 04.02.2012 19:32

вот тут батьки начали этот разговор, но ушли немного далековато от темы (за что их бы неплохо поругать)

хотя там обсуждается как раз добавление в конец списка отображения

тут думаю нет смысла искать "отличия", все-таки метод addChildAt можно использовать для разных контейнеров, а setChildIndex только в текущем

Dukobpa3 04.02.2012 19:52

Код:

298 3158
Мне вот интересна такая разница при первом клике.
Дальше цифры уже меньше отличаются.

Цитата:

Если setChildIndex хорош лишь при индексе [numChildren - 1], то в чем его полезность?
Я хз)) гуглить влом, предположить можно что запилили функционал, ну оказался он неудачным и что. Выпиливать не стали. Ну и я не уверен что производители аж так производительность меряли дотошно. Есть функция и круто - пользуйтесь.

Inet_PC 04.02.2012 20:12

Вообще странно, что setChildIndex проигрывает. Может имеет смысл проверить не дебаг версию?

HardCoder 04.02.2012 20:16

Цитата:

Сообщение от Inet_PC (Сообщение 1060963)
Вообще странно, что setChildIndex проигрывает. Может имеет смысл проверить не дебаг версию?

Как, вывести все в текстфилд? Потому что с профайлерами, дебагерами, или как оно называется, я никогда не работал...

Dukobpa3 04.02.2012 20:27

Код AS3:

tf.text += "some"
//or:
tf.appendText("some")


Jewelz 04.02.2012 20:37

он не об этом =)

имелось ввиду скомпилить под release

в FD (а я так понял вы именно в нем) это рядом с кнопкой Test Project

HardCoder 04.02.2012 20:43

Dukobpa3, я немного не о том спрашивал, а как проверить не дебаг версию :). Короче, не знаю, обьективный ли такой вариант, или нет, но создал текстовое поле. Скомпилировал для релиза и тестировал в браузере (чтоб релиз-флешка не выполнялась в дебаг-плеере ФД). Слева addChildAt(), справа setChildIndex().
Когда все обьекты помещаем на 0-вой индекс:
Цитата:

282 3628
1639 3158
1666 3235
1717 3211
1680 3370
Случайное число от 1 до mcs.length -2 (одинаковое для обоих методов):
Цитата:

749 1194
492 2613
1569 1552
580 1216
1383 1560
mcs.length -1:
Цитата:

1667 1703
1681 1607
1652 1596
1652 1594
1668 1681
Результаты не сильно отличаются от дебажных. Провел еще несколько проверок с разными числами и понял что там как-будто закономерность.
addChildAt() - ему по барабану все.
setChildIndex() - чем ближе индекс к нулю, тем дольше выполняется код. Чем ближе к numchildren-1 -тем быстрее он выполняется и приближается к addChildAt() по скорости.

Dukobpa3 05.02.2012 03:18

Судя по последним цифрам это либо не релизная флешка либо хз. Задержки больше чем в дебажной получаются.
Насчет:
Цитата:

тестировал в браузере (чтоб релиз-флешка не выполнялась в дебаг-плеере ФД)
Это Зависит от режима компиляции а не от того в каком плеере играет.

HardCoder 05.02.2012 03:38

Цитата:

Сообщение от Dukobpa3 (Сообщение 1061014)
Это Зависит от режима компиляции а не от того в каком плеере играет.

Так говорю же: скомпилировал для релиза (переключатель вверху "Release/Debug"). Для уверенности "кликал" в браузере. Вот код:
Код AS3:

public class Main extends Sprite {
        private var mcs:Array;
        private var txt:TextField;
        private var container:Sprite;
 
        public function Main():void {
                this.addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void {
                this.removeEventListener(Event.ADDED_TO_STAGE, init);
                txt = new TextField();
                txt.y = 200;
                txt.height = 300;
                this.addChild(txt);
 
                container = new Sprite();
                this.addChild(container);
 
                mcs = new Array();
                var mc:MC;
                for (var i:uint = 0; i < 4000; i++){
                        mc = new MC();
                        mcs.push(mc);
                        container.addChild(mc);
                }
                this.stage.addEventListener(MouseEvent.CLICK, onClick);
        }
 
        private function onClick(e:MouseEvent):void {
                var index:uint = (mcs.length - 3) * Math.random() + 1;
                //var index:uint = 0;
                //var index:uint = mcs.length - 1;
                var time1:Number = getTimer();
                for (var i:uint = 0; i < mcs.length; i++){
                        container.addChildAt(mcs[i], index);
                }
                time1 = getTimer() - time1;
                var time2:Number = getTimer();
                for (var j:uint = 0; j < mcs.length; j++){
                        container.setChildIndex(mcs[j], index);
                }
                time2 = getTimer() - time2;
                txt.appendText(time1 + "  " + time2 + "\n");
        }
}

MC - это спрайт (синий квадрат, программно нарисованный).

Dukobpa3 05.02.2012 03:45

Значит тогда видимо из-за того что в браузере, там всегда медленнее чем в плеере получается. Ок.


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

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