2013-08-01 2 views
3

나는 Octree를 3 차원으로 빠르게 매치시켰다. 그리고 그것은 빠릅니다! 그러나 옥트리를 삭제하는 것은 옥타브를 삭제하는 것보다 100 배 더 많은 시간이 걸립니다. 나는 이것이 왜 일어나고 있는지 이해하지 못한다. 이것은 내 수업입니다 :왜 재귀 메모리 할당이 느려지나요?

#pragma once 
#include "LeakCheck.h" 
#include "vec3.h" 

namespace Geometry 
{ 

static const float tolerance = 1.0e-30f; 

class VertexOctree 
{ 
private: 
    float halfSize; 
    vec3 center; 
    VertexOctree *subTrees; 
    int vertexIndex; 
    void CreateSubTree() 
    { 
     subTrees = news VertexOctree[8]; 
     subTrees[0] = VertexOctree(center+(vec3(-1.0f,-1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[1] = VertexOctree(center+(vec3(+1.0f,-1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[2] = VertexOctree(center+(vec3(-1.0f,+1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[3] = VertexOctree(center+(vec3(+1.0f,+1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[4] = VertexOctree(center+(vec3(-1.0f,-1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[5] = VertexOctree(center+(vec3(+1.0f,-1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[6] = VertexOctree(center+(vec3(-1.0f,+1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[7] = VertexOctree(center+(vec3(+1.0f,+1.0f,+1.0f)*halfSize),halfSize*0.5f); 
    } 
public: 
    int AddVertex(std::vector<vec3> &VertexList, const vec3& Point) 
    { 
     if (vertexIndex == -1) { 
      vertexIndex = VertexList.size(); 
      VertexList.push_back(Point); 
      return vertexIndex; 
     } 
     if ((VertexList[vertexIndex]-Point).lengthSq() < tolerance) { 
      return vertexIndex; 
     } 
     if (subTrees == NULL) 
      CreateSubTree(); 

     return subTrees[(Point.x>center.x)+(2*(Point.y>center.y))+(4*(Point.z>center.z))].AddVertex(VertexList, Point); 
    } 
    VertexOctree() 
    { 
     subTrees = NULL; 
     vertexIndex = -1; 
    } 
    VertexOctree(vec3 Center, float HalfSize) 
    { 
     subTrees = NULL; 
     center = Center; 
     halfSize = HalfSize; 
     vertexIndex = -1; 
    } 
    ~VertexOctree() 
    { 
     if (subTrees) 
      delete[] subTrees; 
    } 
}; 

}; 

VertexOctree를 삭제하는 데 오랜 시간이 걸립니다. 포인트를 비교하고 메모리를 할당하기 위해 부동 소수점 연산을 수행해야하는 트리를 만드는 것보다 훨씬 오래. 삭제하는 것이 왜 그렇게 느린가요? Visual Studio 2012를 사용하고 릴리스 모드로 컴파일합니다.

+1

릴리스 또는 디버그 빌드에 있습니까? 디버그 빌드는 재사용하기 위해 해제되기 전에 할당 해제 된 모든 메모리를 채 웁니다 (재사용 중인지 여부를 감지하기 위해). –

+0

Visual Studio 2012 및 릴리스 모드로 컴파일하십시오. 릴리스 빌드를 의미했습니다. – bofjas

+1

'subTrees '를 테스트 할 필요가 없습니다.'delete' 연산자가 이미 그렇게합니다. 두 번 할 때 이점이 없습니다. – EJP

답변

4

프로그램을 실행하기 위해 F5 키를 누르면 릴리스 모드에서도 특별하고 느린 디버그 힙이 사용됩니다. ctrl + F5 키를 누르면 디버그 모드에서도 일반 힙이 사용됩니다. 시도해보십시오. 그리고 속도를 높이면 프로젝트의 디버깅 속성에서 환경 상자에 _NO_DEBUG_HEAP = 1을 넣어 항상 빠른 힙을 사용하십시오.

+0

그랬어! 고마워. 나는 그것에 대해 몰랐다. 이것이 디버깅에 어떤 영향을 줍니까? 어쨌든 릴리스 빌드에서 디버깅을 할 수 없다고 생각했습니다. – bofjas

+0

여러분을 환영합니다! 나는 디버그 힙이 버퍼를 덮어 쓰거나 삭제 된 메모리에 쓰지 않는다는 추가적인 체크를한다고 생각한다. –

+0

디버깅을 사용하여 릴리스 모드를 실행할 수 있지만 최적화로 인해 코드가 변경되었을 수 있습니다. –

관련 문제