Просмотр полной версии : много много объектов на сцене
iiiusion
15.06.2016, 13:52
Здравствуйте, положим мне нужно сверстать огромную сцену (размером скажеи 1М на 1М пикселей и столько же объектов). Ну захотелось мне сделать игровой мир бесконечный почти. Ну само собой возникает вопрос производительности т.к. скажем старлинг пробегаясь по дереву пробежится по нему мульён раз. А хотелось бы пробегаться только по тем объектам что во вьюпорте. Вопрос - сколько раз пробежиться старлинг своим render если на сцене 2 000 000 объектов? И второй - как рендерить только то что в зоне видимости и без пробегания всего списка детей?
undefined
15.06.2016, 14:17
вроде даже у нативного дисплей-листа есть обрезание границами вьюпорта, думаю в старлинге должно быть нечто подобное
И второй - как рендерить только то что в зоне видимости и без пробегания всего списка детей?
Хранить детей в quad-tree и обрезать все ненужное чем раньше, тем лучше.Хотя думаю нечто подобное сам fp и так делает.
Старлинг рендерит все, в т.ч то что находится вне вьювпорта.
Да, с q-tree вариант хороший, если все объекты не находятся в движении. а так лучше делать свой qt на каждый слой.
undefined
15.06.2016, 15:20
Старлинг рендерит все, в т.ч то что находится вне вьювпорта.
А с чем связано такое решение?Этож дикий overhead можно хапнуть по незнанию.Может обрезание происходит на уровне opengl?
iiiusion
15.06.2016, 15:30
тут вопрос широкий. по старлингу вот мои доказательства
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 минут
ВСЕМ СПАСИБО!
hasVisibleArea - это проверка visible|scale|alpha
Даниэль писал что проверка габаритов на пререндере создает больший оверхед, чем отправка на карту всего подряд)
iiiusion
15.06.2016, 16:23
а это код из 1.8 из междупрочим) http://wiki.starling-framework.org/extensions/quadtreesprite а это то что нужно)
Да, там еще есть либа разбивающее один displayObjectContainer на слои, и контейнер собирающий их в порядке слоев, а не painterDraw. Думаю в твоем случае есть смысл их объеденить)
caseyryan
15.06.2016, 17:43
Всегда можно найти способ, добавлять минум объектов в определенный этап времени. 2000К объектов на сцене - вот где настоящий оверхэд.
Деревья квадрантов, очень хороший вариант. Но можно и свой гибрид придумать. Все зависит от задач. Мне доводилось делать очень большие карты, и я долго ломал голову над реализацией. В итоге вопрос все-таки решил. И у меня было что-то типа комбинации деревьев квадрантов для расположения динамических объектов. И простого BitmapData#draw() с выбором нужного региона для фона
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.