2013-12-10 1 views
2

Здесь есть два вопроса. Сначала, если мне нужно создать b2BlockAllocator до Clone, а затем удалить (где?) После клонирования? Xcode профилирование прибор не показывает утечки C++ ...Как использовать распределитель Box2D?

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); 
... 

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

Update:

-(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; 
    } 
} 
+1

Не могли бы вы объяснить, что вы пытаетесь сделать, и в чем проблема? Для типичного использования Box2D нет необходимости разбираться с функциями распределителя и клонирования. – iforce2d

+0

@ iforce2d: обязательно. У меня есть кешированные формы и функции, которым я даю тело, идентификатор формы, и он создаст приспособление для этого тела на основе найденной формы. Теперь эта функция также имеет свойство flip, поэтому всякий раз, когда это TRUE, мне нужно создать flipped. Поэтому, прежде чем создавать приспособление, я беру обычную форму из кеша, переворачиваю и затем создаю приспособление. Если нет необходимости перевернуть, я просто создаю приспособление из кешированной формы. Перевернутая часть представлена ​​выше. – Pablo

+0

Если все еще не ясно, я отправлю всю функцию. – Pablo

ответ

0

Я отвечаю на 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, но это было бы больше накладных расходов, чем это необходимо для того, что вы пытаетесь сделать.