Делаю Quadtree для оптимальной отрисовки графических объектов
и коллизий.
У меня есть спрайт
Level наполненный игровыми объектами,
каждый из которых занесен в лист Quadtree.
Когда добавляется спрайт
Level в список отображения,
то всем игровым объектам внутри спрайта я ставлю object.visible = false, т.е.
скрываю их.
Далее речь пойдет только об отрисове, физику отбросим:
В результате я получаю список объектов
List,
которые попадают в обзор камеры (прямоугольника).
Из возвращенного списка
List я всем объектам назначаю object.visible = true.
Все ок, отображаются только нужные объекты, но далее камера перемещается
и те объекты которые были видимы мы их должны скрыть, чтобы они заного
прошли проверку Quadtree.
Получается так:

Код:
private function onEnterFrame(e:Event):void
{
//скрываем все объекты которые были отображены в предыдущей итерации.
for each(var obj:BaseObject in bufOb)
{
obj.visualOb.visible = false;
obj.body.SetAwake(false);
}
bufOb.length = 0;
// quadTree возвращает все нужные объекты r, которые попали в поле видимости камеры
var r:* = quadTree.check(checkRC, e.target.graphics);
//перебираем полученные объекты и показываем их
while (r != null)
{
r.visualOb.visible = true;
//заносим в массив bufOb, чтобы в сл итерации скрыть их до проверки quadTree
bufOb.push(r);
r = r.nextResult;
}
}
В итоге мне очень не нравится, что приходится в
bufOb
запоминать прорисованные объекты и далее перед проверкой quadTree скрывать их.
Т.к. иначе камера может переместиться и эти объекты будут отображены, хотя они не
попадают в область видимости камеры.
Вообще скрывать/показывать объекты это наверно не очень хороший вариант, т.к. если
объектов тысячи, то хоть они и крыты но флеш будет тратить на них ресурсы, т.к. они в
списке отображения. Если же делать removeChild/addChild, то тут значительно больше
работы по возвращению в сцену объекта в нужном положении/состоянии.
Хотелось бы отрисовывать объекты через свойство visible = true/false, но вот вариант,
где надо скрывать объекты перед проверкой мне не очень нравится…
Как лучше, организовать отрисовку объектов (вворачиваемых из quadTree)?
А вообще нужна ли фильтрация отрисовки объектов, ведь флеш и сам не прорисовывает
графику все зоны видимости...
Помню, делал давно Octree на DirectX и там, чтобы отрисовать объект надо было в
рендере вызвать функцию прорисовки объекта (не вызвана покадрово –
не прорисовывается объект), т.е. почти нет лишних движений.