2014-11-10 2 views
0

В моей игре класс ObjectManager управляет всеми объектами моей игры и содержит список объектов.

и я использую инструкцию 2, когда я проверяю столкновение каждого объекта.Как оптимизировать проверку столкновений объектов в играх?

for(int i = 0; i < objectnum; ++i) 
{ 
    for(int j = 0; j < objectnum; ++j) 
    { 
    AABB_CollisionCheck() 
    } 
} 

но если предметов в игре много, FPS становится ниже. (80 объектов == 40 кадров) возможно, это связано с тем, что мой метод проверки столкновений неэффективен. (если объект Num равен п, то мой метод работает п^2 раза)

  1. вы можете дать мне несколько советов по поводу этого столкновения Проверки по оптимизации,

Я хочу уменьшить цикл for для проверки каждого столкновения объектов.

  1. Что нового в использовании функции обратного вызова или нет? для проверки на столкновение. Есть ли какие-либо приключения скорости работы по поводу обратного вызова?




p.s Большое спасибо за прочитать мой вопрос. и, пожалуйста, простите за мой английский мастерство ...

+2

Вы не должны проверить, сталкивается ли B с A, если вы уже проверили, сталкивается ли с В. – Blutkoete

+0

возможный дубликат [Что метод следует использовать для prune 2d collision проверит?] (http://stackoverflow.com/questions/414553/what-technique-should-be-used-to-prune-2d-collision-checks) – slaphappy

+0

Наиболее очевидным улучшением будет запуск второго цикла от 'i + 1'.После этого вы, вероятно, захотите взглянуть на код столкновения, а когда это не поможет, - какую-то схему разделения пространства. Профилировщик - хорошая помощь. – molbdnilo

ответ

0
  1. вы можете дать мне несколько советов по поводу этого столкновения Check Optimizing?

Ну, во-первых, вы можете попробовать оптимизировать второй цикл делает таким образом:

for (int i = 0; i < objectnum; i++) 
{ 
    for (int j = i+1; j < objectnum; j++) 
    { 
    AABB_collisioncheck(); 
    } 
} 

Это будет только проверять столкновения в одну сторону, скажем А столкнулось B, то вы не вызовете B столкнулся A.

1

Как это часто бывает, знание дополнительного словарного запаса вызывает здесь чудеса для нахождения большого количества информации. То, что вы ищете, называется широкой фазой обнаружения столкновений, которое представляет собой любой метод, который мешает вам смотреть на каждую пару объектов и, следовательно, надеяться избежать сложности n^2.

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

Другой метод называется Sweep and Prune, который использует тот факт, что объекты обычно не перемещаются от одного кадра к другому.

Вы можете найти более подробную информацию по этому вопросу: Broad-phase collision detection methods?

Смежные вопросы