2013-12-10 2 views
2

두 가지 질문이 있습니다. 먼저 Clone 전에 b2BlockAllocator을 만든 다음 복제 후 (?)를 삭제해야합니까? 엑스 코드 프로파일 링 악기는 법선을 계산하는 설정하고 몸에 반대 할당 정점을 수정, 그것을 복제, 내가 캐시 모양 객체를 가지고이 코드에서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); 
... 

... C++ 누수를 표시하지 않습니다. 질문 -이게 합법적입니까?

업데이트 : 나는 b2Shape::Clone 방법을 사용하지 않기 때문에

-(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의 전형적인 사용을 위해서 allocator와 clone 함수를 다룰 필요는 없다. – iforce2d

+0

@ iforce2d : 물론. 나는 셰이프와 함수를 캐싱하여 몸체, 모양 ID를주고, 발견 된 모양을 기반으로 그 몸체를위한 조명기를 만듭니다. 이제는 함수도 flip 속성을 가지고 있으므로 TRUE 일 때마다 뒤집힌 fixture를 만들어야합니다. 따라서 조명기를 만들기 전에 캐시에서 일반적인 모양을 가져 와서 뒤집은 다음 조명기를 만듭니다. 플립 할 필요가 없으면 캐시 된 모양에서 조명기를 만듭니다. 뒤집기 부분은 위에 나와 있습니다. – Pablo

+0

아직 명확하지 않은 경우 전체 기능을 게시합니다. – Pablo

답변

0

나는 비슷한 대답을 찾으려고 노력하면서 4 년 늦었다. Box2D를 사용하는 사람들은 거의없는 것 같습니다.

따라서 new b2BlockAllocator이 (가) 어디서나 삭제되지 않으며 복제 기능으로도 삭제되지 않으므로 분명히 유출됩니다.

로컬 b2BlockAllocator를 작성하여 범위를 벗어날 때 파괴되도록하십시오. 그리고 그게 다야.

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

내가 Box2D의 할당을 사용하지 않을 것입니다. 직접적으로. 로컬 배열에 다각형의 정점,

  • 그 사본을 수정

    1. 복사,
    2. A가 b2PolygonShape,
    3. 가 새롭게 인스턴스에 Set를 호출 인스턴스화 대신, 나는 다음을 수행 할 것 b2PolygonShape 내 수정 된 버텍스를 할당하려면
    4. 본문의 b2Body::CreateFixture 메서드를 호출하여 원래 몸체에 할당 된 b2PolygonShape을 사용하여 새 조명기를 만들고
    5. 본문의 b2Body::DestroyFixture 메서드를 호출하여 원래의 조명기를 제거합니다.

    b2BlockAllocator 클래스

  • 인스턴스화 동적 차례로 b2BlockAllocator 인스턴스의 수명 내에서 사용할 수있는 메모리를 할당하는 데 사용하지만, 그건 당신이 뭘 하려는지에 대해 필요 이상으로 오버 헤드가 될 거라고 할 수 있습니다.