Как использовать распределитель Box2D?

Здесь есть два вопроса. Во-первых, если мне нужно создать b2BlockAllocator до Clone а потом удалить (где?) после клона? Инструмент профилирования XCode не показывает утечки C ++ …

b2FixtureDef fixd = fix->fixture;
const b2Shape *shape = fixd.shape;
if(shape->GetType()== b2Shape::e_polygon && flip)
{
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(new b2BlockAllocator());
for(int i=0;i<ps->m_vertexCount;i++)
{
ps->m_vertices[i].x *= -1;
ps->m_vertices[i].y *= -1;
}

ps->Set(&ps->m_vertices[0], ps->m_vertexCount);
body->CreateFixture(ps, 1.0f);
...

В этом коде я беру кешированный объект формы, клонирую его, изменяю вершины, устанавливаю для вычисления нормалей и присваиваю его объект для тела. Вопрос — это законно?

Обновить:

-(void) addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shapeName flip:(BOOL)flip
{
BodyDef *so = [shapeObjects_ objectForKey:shapeName];
assert(so);

FixtureDef *fix = so->fixtures;
while(fix)
{
b2FixtureDef fixd = fix->fixture;
const b2Shape *shape = fixd.shape;
if(shape->GetType()== b2Shape::e_polygon && flip)
{
b2BlockAllocator allocator;
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(&allocator);
for(int i=0;i<ps->m_vertexCount;i++)
{
ps->m_vertices[i].x *= -1;
ps->m_vertices[i].y *= -1;
}

ps->Set(&ps->m_vertices[0], ps->m_vertexCount);
body->CreateFixture(ps, 1.0f);
}
else
{
NSLog(@"noflip...%@", shapeName);
body->CreateFixture(&fix->fixture);
}
fix = fix->next;
}
}

2

Решение

Я отвечаю на 4 года позже, пытаясь найти аналогичный ответ. Кажется, мало кто прошел лишнюю милю с Box2D.

Итак, вы определенно протекаете с new b2BlockAllocator не удаляется нигде, ни вами, ни функцией Clone.

Просто создайте локальный b2BlockAllocator, чтобы он был уничтожен, когда он выходит за рамки видимости. И это все.

    b2BlockAllocator cloneHelper;
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(&cloneHelper);
0

Другие решения

Я бы не использовал распределитель Box2D, потому что я бы не использовал b2Shape::Clone метод. Не напрямую. Вместо этого я бы сделал следующее:

  1. скопировать вершины многоугольника в локальный массив,
  2. изменить эти копии,
  3. создать экземпляр b2PolygonShape,
  4. взывать Set на недавно созданный b2PolygonShape назначить ему мои измененные вершины,
  5. создать новый прибор, используя мой назначенный b2PolygonShape на первоначальном теле, вызвав тело b2Body::CreateFixture метод и
  6. назвать тело b2Body::DestroyFixture способ избавиться от оригинального приспособления.

b2BlockAllocator класс может быть создан и использован для динамического выделения памяти, которая, в свою очередь, может использоваться в течение времени жизни b2BlockAllocator например, но это было бы больше, чем необходимо для того, что вы пытаетесь сделать.

0

По вопросам рекламы [email protected]