Коли квадратний хід є кращим перед просторовим хешуванням?


12

Я роблю 2d платформер з великою кількістю об'єктів одночасно. У всіх виявлено зіткнення AABB. Я спершу спробував квадратне зменшення кількості об'єктів для перевірки, спробував декілька різних конфігурацій, але це не виявилося настільки ефективним, як мені потрібно. Я реалізував просторовий хеш і це набагато ефективніше, кількість об'єктів для перевірки для кожного зіткнення різко зменшилася.

Чи є випадок, коли 2D виявлення зіткнень за допомогою квадрату є кращим перед просторовим хешированием? Згідно з моїми тестами, здається, що просторове хешування завжди закінчується меншою кількістю об'єктів, які піддаються тестуванню на зіткнення?

Я не займався тимчасовою розробкою алгоритмів, але хеширование просто дуже дороге або складно реалізувати, коли ви, наприклад, кодуєте C? Варто зазначити, що я пишу гру в javascript, де ви хешируете "безкоштовно".

Ось порівняння, чи я щось пропустив? http://zufallsgenerator.github.io/2014/01/26/visual-comparing-algorithms/

Відповіді:


12

Основна перевага квадратичного дерева полягає в тому, що воно дозволяє дуже швидко відкинути цілі групи відра від розгляду.

Наприклад, припустимо, що у мене є чотиригранне дерево з шістьма рівнями. На найнижчому рівні це 32х32 коробки; 1024 ящики, що містять цей нижній, найбільш детальний рівень. Для порівняння ми також розглянемо "просторовий хеш" - плоску сітку, яка також містить 32х32 коробки, 1024 коробок загалом. (у квадрового дерева загалом більше 1024 коробок, оскільки воно також містить більші ящики на більш високих рівнях)

Припустимо, що в системі немає об'єктів, що стикаються - всі поля нашого квадратичного дерева та нашої плоскої сітки повністю порожні.

Якщо ви тестуєте зіткнення чогось досить великого, щоб його обмежувальний ящик перетинав усі ці скриньки, і ви використовуєте плоску сітку, ви повинні перевірити кожну з цих 1024 коробок, щоб побачити, чи є ще щось у їх.

Але якщо ви використовуєте вкладене квадратичне дерево, самий верхній рівень може сказати вам, що в системі немає інших об'єктів, і тому вам потрібно лише подивитися на це одне поле, щоб знати, що ви не збираєтеся знаходити зіткнення глибше в дерево - ви можете негайно припинити тестування.

Аналогічно, якщо об'єкти існують лише у певних регіонах квадрового дерева, квадрове дерево, природно, буде вести ваш пошук лише через потенційно відповідні поля, тоді як сітка вимагає перевірити кожне пересічене поле, тому що ви не можете знати заздалегідь. які квадрати сітки будуть мати в них об’єкти. Якщо більша частина вашого квадратичного дерева порожня, і ви робите великі, складні запити (скажімо, величезні фрустування камери замість маленьких, простих прямокутників), то, можливо, ви виявите, що ви повторюєте понад набагато менші поля, якщо ви робите тести на щось, використовуючи структуру дерева, а не плоску сітку. І це може мати велике значення.

Звичайно, все не означає, що структура дерева - це завжди правильний вибір. Плоскі сітки ідеально підходять для ситуації у вашому прикладі - густі хмари предметів майже рівномірно розподіляються по всьому світу, і ми робимо прості, недорогі тести на зіткнення. Абсолютно сітка, ймовірно, буде оптимальним підходом у такому випадку!


5
Лаконічне підсумок, для надзвичайно лінивих: квадрати швидше обробляють об'єкти різного розміру.
Анко

Дякую, це відмінна відповідь! Рівномірний розмір предметів - це те, про що я підозрював.
Кріс

Насправді вам, як правило, доведеться шукати всі рівні квадратичного дерева, щоб перевірити, чи немає об'єктів, оскільки в цілому рівень містить лише інформацію про об'єкти, які повністю вписуються у межі цього рівня і не вміщуються на нижчий рівень.
малте

1
@malthe Якщо ви наполягаєте на тому, щоб використовувати реалізацію квадратичного дерева, яка не може на початку цього виду запиту, то замість цього абсолютно використовуйте просторовий хеш; ви заощадите 33% вартості пам’яті, і від цього ви жодним чином не отримаєте користі. Або ж ви можете послабити свою ідеалогічну чистоту просто кузнечком і використовувати квадроцикличне дерево, яке може заздалегідь виконувати, або шляхом кожного вузла відстежувати кількість сутностей у своїх дітей, або ж за допомогою розрідженого квадрату, таким, що порожні вузли від’єднано від дерева, поки вони не знадобляться. Насправді. Більше п'яти років потому.
Тревор Пауелл

@TrevorPowell звичайно, ти маєш рацію. Я щойно перейняв вашу гарантію того, що вам потрібно було дивитись лише на одну коробку. Це просто не відповідає дійсності, тому що вам доведеться дотримуватися цих показників. Наскільки я можу сказати, ви можете знайти зіткнення вище і далі вниз по дереву.
мальте
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.