Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   много много объектов на сцене (http://www.flasher.ru/forum/showthread.php?t=213015)

iiiusion 15.06.2016 13:52

много много объектов на сцене
 
Здравствуйте, положим мне нужно сверстать огромную сцену (размером скажеи 1М на 1М пикселей и столько же объектов). Ну захотелось мне сделать игровой мир бесконечный почти. Ну само собой возникает вопрос производительности т.к. скажем старлинг пробегаясь по дереву пробежится по нему мульён раз. А хотелось бы пробегаться только по тем объектам что во вьюпорте. Вопрос - сколько раз пробежиться старлинг своим render если на сцене 2 000 000 объектов? И второй - как рендерить только то что в зоне видимости и без пробегания всего списка детей?

undefined 15.06.2016 14:17

вроде даже у нативного дисплей-листа есть обрезание границами вьюпорта, думаю в старлинге должно быть нечто подобное
Цитата:

И второй - как рендерить только то что в зоне видимости и без пробегания всего списка детей?
Хранить детей в quad-tree и обрезать все ненужное чем раньше, тем лучше.Хотя думаю нечто подобное сам fp и так делает.

faraday 15.06.2016 15:08

Старлинг рендерит все, в т.ч то что находится вне вьювпорта.
Да, с q-tree вариант хороший, если все объекты не находятся в движении. а так лучше делать свой qt на каждый слой.

undefined 15.06.2016 15:20

Цитата:

Старлинг рендерит все, в т.ч то что находится вне вьювпорта.
А с чем связано такое решение?Этож дикий overhead можно хапнуть по незнанию.Может обрезание происходит на уровне opengl?

iiiusion 15.06.2016 15:30

тут вопрос широкий. по старлингу вот мои доказательства
Код AS3:

public override function render(support:RenderSupport, parentAlpha:Number):void
        {
            var alpha:Number = parentAlpha * this.alpha;
            var numChildren:int = mChildren.length;
            var blendMode:String = support.blendMode;
 
            for (var i:int=0; i<numChildren; ++i)
            {
                var child:DisplayObject = mChildren[i];
 
                if (child.hasVisibleArea)
                {
                    var filter:FragmentFilter = child.filter;
 
                    support.pushMatrix();
                    support.transformMatrix(child);
                    support.blendMode = child.blendMode;
 
                    if (filter) filter.render(child, support, alpha);
                    else        child.render(support, alpha);
 
                    support.blendMode = blendMode;
                    support.popMatrix();
                }
            }
        }

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

а за вектор спасибо, буду копать теперь)

Добавлено через 12 минут
ВСЕМ СПАСИБО!

faraday 15.06.2016 15:43

hasVisibleArea - это проверка visible|scale|alpha
Даниэль писал что проверка габаритов на пререндере создает больший оверхед, чем отправка на карту всего подряд)

iiiusion 15.06.2016 16:23

а это код из 1.8 из междупрочим) http://wiki.starling-framework.org/e...quadtreesprite а это то что нужно)

faraday 15.06.2016 16:48

Да, там еще есть либа разбивающее один displayObjectContainer на слои, и контейнер собирающий их в порядке слоев, а не painterDraw. Думаю в твоем случае есть смысл их объеденить)

caseyryan 15.06.2016 17:43

Всегда можно найти способ, добавлять минум объектов в определенный этап времени. 2000К объектов на сцене - вот где настоящий оверхэд.
Деревья квадрантов, очень хороший вариант. Но можно и свой гибрид придумать. Все зависит от задач. Мне доводилось делать очень большие карты, и я долго ломал голову над реализацией. В итоге вопрос все-таки решил. И у меня было что-то типа комбинации деревьев квадрантов для расположения динамических объектов. И простого BitmapData#draw() с выбором нужного региона для фона


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

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