Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "for" сильно тормозит при создание 10.000 объектов (http://www.flasher.ru/forum/showthread.php?t=195770)

dvrbear 13.03.2013 00:38

"for" сильно тормозит при создание 10.000 объектов
 
Пытался сделать - скажем так - звездное небо.
Для того, чтоб множество векторных объектов не тормозили при движение, решил не выводить на экран
объект содержащий их, а перегонять через BitmapData необходумую часть перенося ее в другой "Мувик".

Всебы хорошо, строится небо, перегонятеся нужный bitmap кусок, НО...
При конструирование 10.000 простых квадратиков, флеш сильно подвисает. (просто в процессе их создания)
А ежели выставить 100.000 звезд то и вовсе выпадает собщение о прекращение кода.

Можно ли как-то ускорить процесс создания не разбивая на куски создание "рэндомной вселенной" ?
На всякий случай приведу кусок своего кода с функцией конструирования.

Код AS3:

protected function buildUni():void
{
 
                                var num:Number = 10000;
                                var rand:Number = num/20;
                                var dist:Number = 10;
 
                                for(var i:Number=0; i<num; i++){
                                        var nSec:BSector = new BSector();
                                        nSec.x = (Math.random()*rand - rand/2) * dist;
                                        nSec.y = (Math.random()*rand - rand/2) * dist;
                                        container.addChild(nSec);
                                        var pid:Number = 0;
 
                                        for(var yy:Number=0; yy<5; yy++){       
                                                for(var xx:Number=0; xx<5; xx++){       
                                                        var nPix:BPix = new BPix();
                                                        MovieClip(nPix).gotoAndStop(1);
                                                        nPix.x = xx - 5;
                                                        nPix.y = yy - 5;
                                                        nSec.addChild(nPix);
                                                        pid++;
                                                }
                                        }
                                }
                                var res:MovieClip = new MovieClip();
                                bmd = new BitmapData(100, 80, false, 0);
                                bmd.draw(container);
                                res.graphics.beginBitmapFill(bmd);
                                res.graphics.drawRect(0, 0, 100, 100);
                                res.graphics.endFill();
                                res.x = 200;
                                uni.addChild(res);
                                //uni.addChild(container);
                                addElement(uni);
                        }

П.С.
Если закоменчиваю объекты и подставляю простейшее забитие координат в массив, то работает конечно пошустрей.
Но если ставлю число 1.000.000 то тоже довольно-таки сильно тормазит, а при 10.000.000 вылетает.

Неужели даже координаты более миллиона объектов записать не удастся?

Ведь есть нереально обширные проекты в которых еще больше объектов встречается не говоря о элементарных координатах...

NoisyFlasher 13.03.2013 00:54

Я может сейчас глупость спрошу, но все-таки.
А зачем так много звезд? Т.е. вот у меня разрешение экрана 1920 на 1080. Итого - 2.073.600 точек на весь экран. Если предположить, что одна звездочка - это одна точка, значит, при их количестве в 1.000.000 у меня будет половина экрана - белым, верно?..

dvrbear 13.03.2013 01:04

Вот как в воду глядел когда писал про космос и звезды )))
Просто так саму идею пояснить удобней было.
А звезды не означают пиксели - допустим у меня это квадратики 10х10 в которых есть еще по нескольку квадратиков 1х1 и они не все сразу в экран вмещаются, а уходят далеко за грани.

И вот всю эту "кухню" необходимо рэндомно разбросать (а не достраивать) чтоб изначально было известно где и какой объект находится, а также будет необходимость в движение и зумирование.

Огромное спасибо за расчеты, сожалею что вы на них потратили свое время )

MikroAcse 13.03.2013 01:05

А вообще, рисуйте на Bitmap.
Будет быстрее через setPixel.

dvrbear 13.03.2013 01:09

Есть объекты, хорошо, допустим не квадратики а целые картинки или векторные кривые.
Речь сейчас не о них а о главном вопросе темы...

Добавлено через 52 секунды
"for" сильно тормозит при создание 10.000 объектов
Можно ли как-то ускорить процесс создания не разбивая на куски создание "рэндомной вселенной" ?

MikroAcse 13.03.2013 01:10

Цитата:

Речь сейчас не о них а о главном вопросе темы...
Так зачем тебе столько объектов, если они не уместятся даже в экран 30'?

Можешь попробовать "асинхронно" (разбить цикл на маленькие циклы и повторять каждый enterFrame), но это врядли чем-то поможет.
Хотя, может помочь, если сделать так:
Нарисовал нужный кусок -> перерисовал в bitmapData -> удалил кусок, оставил bitmapData -> ожидание след. кадра для отрисовки след. куска.

dvrbear 13.03.2013 01:12

Ну вот про это и спрашиваю, значит For ничем ускорить нельзя и While будет работать на сколько понимаю еще дольше.

Значит необходимо искать лишь другие пути решения и разбивать на куски?

MikroAcse 13.03.2013 01:18

Цитата:

Ну вот про это и спрашиваю, значит For ничем ускорить нельзя и While будет работать на сколько понимаю еще дольше.
Нет. While ~ for (их скорость одинакова).

Цитата:

Значит необходимо искать лишь другие пути решения и разбивать на куски?
Да, это очевидно.

mikhailk 13.03.2013 01:30

Цитата:

И вот всю эту "кухню" необходимо рэндомно разбросать (а не достраивать) чтоб изначально было известно где и какой объект находится, а также будет необходимость в движение и зумирование.
Собственно, разбросать можно без создания каких-либо объектов вообще.
Отдельно модель мира, отдельно представление части ее на экране (активного сегмента). По мере необходимости дорисовываются необходимые сегменты и производится сдвиг в нужном направлении, ненужные - чистятся. Задача, на самом деле, не такая тривиальная, как выглядит, но решаемая (врочем, сейчас кто-нибудь скажет, что это элементарно :) ).

ЗЫ. Но что-то меня число 100 тысяч все равно пугает.

Sync 13.03.2013 01:30

Да вы смеетесь. на 10 000 итераций основного цикла (каждый раз создание объекта и добавление его в контейнер) сверху 25 созданий+добавлений во внутренних циклах. 260 000 действий не самых быстрых. а вы хотите ещё на 2 порядка поднять?!


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

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