Должен ли я попытаться максимально объединить статические тела?

Я делаю игру в жанре roguelike, используя XNA и физику farseer. Некоторые комнаты будут иметь процедурно сгенерированную пещеру, состоящую из блоков. пещеры с включенным режимом отладки ясновидящего

На данный момент каждый блок является отдельным телом. создан таким образом:

 _floor = BodyFactory.CreateRectangle(_world,   ConvertUnits.ToSimUnits(Globals.SmallGridSize.X), ConvertUnits.ToSimUnits(Globals.SmallGridSize.Y), 30f);
        _floor.Position = ConvertUnits.ToSimUnits(_position.X + _centerVect.X, _position.Y + _centerVect.Y);
        _floor.IsStatic = true;
        _floor.Restitution = 0.2f;
        _floor.Friction = 0.2f;

Должен ли я просто иметь одно тело на комнату и добавлять все прямоугольные формы для каждого блока в тело? Даст ли это мне прирост производительности? Также можно будет добавлять и удалять формы блоков к этому телу (чтобы иметь возможность уничтожить блок, а затем «добавить» незащищенный блок за ним)?


person Guye Incognito    schedule 12.02.2013    source источник


Ответы (1)


Скорее всего, вы захотите сохранить 1 тело на блок, так как вам будет намного проще управлять столкновениями при разрушении блока. Подумайте о том, чтобы пересчитать форму тела 1 после разрушения блока. Это было бы довольно обременительно.

Это очень похоже на игру, которую я забросил. Изначально у меня было тело для каждого блока, что было очень медленно:

http://www.jgallant.com/images/uranus/land2.png

Моя первая оптимизация заключалась только в установке тел на краю сгенерированного мира:

http://www.jgallant.com/images/uranus/chunk.png

Это привело к более быстрому коду, но по-прежнему оставалась проблема со слишком большим количеством тел на экране. Мои более поздние оптимизации добавляли тела к краям в зависимости от того, где игрок находился в мире. Тела были извлечены из пула доступных тел и перемещены в нужное место. Тела никогда не уничтожались, просто перемещались в Vector2(Int.Min, Int.Min), когда они не использовались. Когда их нужно было использовать, их перемещали в положение:

http://www.jgallant.com/images/collision2.jpg

Это обеспечило самый быстрый код из трех методов. Если вы хотите разрушать/создавать тела на лету, это действительно плохая идея. Вам лучше хранить доступные тела в пуле и использовать их повторно.

С этим тоже есть некоторые сложности. В данный момент у меня нет под рукой моего кода, но если у вас есть дополнительные вопросы, я могу опубликовать часть своего кода, чтобы помочь.

person jgallant    schedule 12.02.2013
comment
Большое спасибо! Это так уместно :) Я думаю, что смогу достаточно легко реализовать вашу 3-ю оптимизацию.. Это умное решение!.. Одна вещь, о которой я сейчас думаю, это как бороться с пулями в игре. Я думал об использовании farseer для столкновений пуль и о том, чтобы пули были кинематическими телами без реакции на столкновение или датчиков. Но теперь я делаю свою собственную систему столкновения пуль, используя что-то вроде этого xbox.create.msdn.com/en-US/education/catalog/tutorial/ может понадобиться 100 пуль, потенциально, я думаю, это быстро - person Guye Incognito; 12.02.2013
comment
Я бы посоветовал вам использовать пул для ваших пуль. Я решил не использовать Farseer для своей системы пуль, так как без него она была намного быстрее. Однако, если у вас есть очень быстро движущиеся пули, вы можете столкнуться с проблемами, когда пули проходят сквозь объекты. - person jgallant; 12.02.2013
comment
Кстати. Если вы посмотрите на мой текущий скриншот, у меня есть комнаты, площадь которых в 6 раз больше (2x3), и у меня там были все блоки и они были включены. Кроме того, в текущей сборке в каждой комнате есть эти пещерные блоки, но все они просто отключены для не текущей комнаты. реализовано что-то вроде вашего метода 3, за исключением того, что блоки просто включаются и отключаются. Кажется, отключение экономит львиную долю вычислительной мощности. - person Guye Incognito; 13.02.2013
comment
Это звучит как хорошее решение для вашего сценария. Мой мир был бесконечен (теоретически) во всех направлениях. Из-за этого мне нужно было иметь возможность перерабатывать тела, чтобы сохранить память. Продолжайте в том же духе, мне было бы интересно посмотреть, как будет выглядеть ваш конечный продукт. - person jgallant; 13.02.2013
comment
Спасибо и да обязательно! Как только у меня будет определенная сумма, я подниму веб-сайт. Я могу отправить вам ссылку через этот сайт. - person Guye Incognito; 13.02.2013