Должен ли я попытаться объединить статические тела как можно больше?
Я делаю игру в стиле 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;
Должен ли я просто иметь одно тело на комнату и добавить все прямоугольники для каждого блока к телу? Это даст мне повышение производительности? Также будет ли возможность добавлять и удалять формы блоков к этому телу (для того, чтобы иметь возможность уничтожить блок и затем "добавить" открытый за ним)?
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
Это обеспечило самый быстрый код из трех методов. Если вы хотите уничтожать / создавать тела на лету, это действительно плохая идея. Вам лучше хранить имеющиеся тела в пуле и повторно использовать их.
В этом также есть некоторые сложности. В данный момент у меня нет удобного кода, но если у вас есть дополнительные вопросы, я могу выложить часть своего кода, чтобы помочь.