Лучшее решение для удаления 2D окклюзии

В моей 2D-игре есть статические и динамические объекты. Камер может быть несколько. Моя проблема: Определить объекты, которые пересекаются с прямоугольником обзора текущей камеры.

В настоящее время я просто перебираю все существующие объекты (не обращая внимания на динамические или статические) и выполняю проверку AABB с прямым обзором камеры на них. Это кажется приемлемым для очень динамических объектов, но не для статических объектов, где их могут быть десятки тысяч (геометрия статического уровня разбросана по всей сцене).

Я изучил несколько структур данных, которые могли бы решить мою проблему:

  • Quadtree

Это было первое, что я подумал, однако проблема в том, что это заставит мои сцены иметь фиксированный размер. (Допустимо для статических, но не для динамических объектов)

  • Динамическое дерево AABB

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

  • Пространственный хеш

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

В целом, мои критерии хорошего решения этой проблемы:

  • Динамический размер: решение не должно приводить к ограничению размера сцены или требованию серьезного пересчета для изменения размера.

  • Хорошая производительность запросов (для камеры)

  • Хорошая поддержка очень динамичных объектов: вычисления, необходимые для обработки объектов с постоянно меняющейся позицией, должны быть хорошими:

Максимальное разумное количество динамических объектов в моей игре за один раз, вероятно, составляет 5000. Учтите, что все они меняют свое положение каждый кадр. Существует ли даже структура данных, которая может быть быстрее, учитывая частые вставки и удаления, чем сравнение AABB объектов с камерой каждый кадр?


person Hamilton    schedule 08.08.2011    source источник
comment
Что вы имеете в виду под фиксированным размером?   -  person user703016    schedule 08.08.2011
comment
@Cicada: когда вы создаете дерево квадрантов, вам нужно установить размер корневого узла. Изменение размера корневого узла обходится дорого, поскольку требует перестройки всего дерева, и вы, вероятно, не захотите делать это только в том случае, если какой-то небольшой объект покидает область корневого узла. Думаю, именно это он имел в виду, говоря о фиксированном размере.   -  person lamas    schedule 08.08.2011
comment
Почему вам не подходит пространственный хэш? Я знаю как минимум 2 кривые заполнения пространства и 6 их вариаций, которые могут пригодиться. Мне больше всего нравится кривая Гильберта. Вы можете немного объяснить свои проблемы? Я исправил свой ответ, потому что 1 кривую, которую я знаю, очень сложно построить (кривая Мура).   -  person Gigamegs    schedule 08.08.2011
comment
@Cicada: Может, он имеет в виду высоту дерева? Но это не исправлено.   -  person Gigamegs    schedule 08.08.2011
comment
Джитамаро: Он имеет в виду размер корневого узла, я уверен   -  person lamas    schedule 08.08.2011


Ответы (1)


Не пытайтесь найти серебряную пулю. Просто разделите свою сцену на динамическую и статическую части и используйте для них разные алгоритмы.

  • Квадратные деревья, очевидно, подходят для статической геометрии с фиксированными границами.

  • Пространственные хэши идеальны для наборов объектов с похожими размерами
    (например, систем частиц).

  • AFAIK динамические деревья AABB редко используются для отбраковки окклюзии, их основная цель - широкая фаза обнаружения столкновений.

  • И, как вы заметили, отбраковка методом перебора является нормальным явлением для динамических объектов, если их количество не очень велико.

геометрия статического уровня, разбросанная по всей сцене

Если ваша сцена очень разреженная, вы можете разделить ее на острова, т.е. создать список частей сцены с «хорошей плотностью».

person Dmitry Sapelnikov    schedule 07.11.2011