나는 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를 사용하고 릴리스 모드로 컴파일합니다.
릴리스 또는 디버그 빌드에 있습니까? 디버그 빌드는 재사용하기 위해 해제되기 전에 할당 해제 된 모든 메모리를 채 웁니다 (재사용 중인지 여부를 감지하기 위해). –
Visual Studio 2012 및 릴리스 모드로 컴파일하십시오. 릴리스 빌드를 의미했습니다. – bofjas
'subTrees '를 테스트 할 필요가 없습니다.'delete' 연산자가 이미 그렇게합니다. 두 번 할 때 이점이 없습니다. – EJP