Reduce memory fragmentation in COctreeTriangleSelector.
Thx@ Squarefox for reporting (http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=52484) Basically the loop was split into 2 loops so children do their allocations after the parent node has finished his. Otherwise we got fragmentation by chaotic allocation order where parents/childs switched all the time. Also indention of loop changed (sorry, should have done that before). git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5812 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
278f5f14e4
commit
574357cb28
|
@ -96,38 +96,47 @@ void COctreeTriangleSelector::constructOctree(SOctreeNode* node)
|
||||||
// calculate children
|
// calculate children
|
||||||
|
|
||||||
if (!node->Box.isEmpty() && (s32)node->Triangles.size() > MinimalPolysPerNode)
|
if (!node->Box.isEmpty() && (s32)node->Triangles.size() > MinimalPolysPerNode)
|
||||||
for (s32 ch=0; ch<8; ++ch)
|
|
||||||
{
|
{
|
||||||
box.reset(middle);
|
for (s32 ch=0; ch<8; ++ch)
|
||||||
box.addInternalPoint(edges[ch]);
|
|
||||||
node->Child[ch] = new SOctreeNode();
|
|
||||||
|
|
||||||
for (s32 i=0; i<(s32)node->Triangles.size(); ++i)
|
|
||||||
{
|
{
|
||||||
if (node->Triangles[i].isTotalInsideBox(box))
|
box.reset(middle);
|
||||||
|
box.addInternalPoint(edges[ch]);
|
||||||
|
node->Child[ch] = new SOctreeNode();
|
||||||
|
|
||||||
|
for (s32 i=0; i<(s32)node->Triangles.size(); ++i)
|
||||||
{
|
{
|
||||||
node->Child[ch]->Triangles.push_back(node->Triangles[i]);
|
if (node->Triangles[i].isTotalInsideBox(box))
|
||||||
//node->Triangles.erase(i);
|
{
|
||||||
//--i;
|
node->Child[ch]->Triangles.push_back(node->Triangles[i]);
|
||||||
|
//node->Triangles.erase(i);
|
||||||
|
//--i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keepTriangles.push_back(node->Triangles[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memcpy(node->Triangles.pointer(), keepTriangles.pointer(),
|
||||||
|
sizeof(core::triangle3df)*keepTriangles.size());
|
||||||
|
|
||||||
|
node->Triangles.set_used(keepTriangles.size());
|
||||||
|
keepTriangles.set_used(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: We use an extra loop to construct child-nodes instead of doing
|
||||||
|
// that in above loop to avoid memory fragmentation which happens if
|
||||||
|
// the code has to switch between allocating memory for this node and
|
||||||
|
// the child nodes (thanks @Squarefox for noting this).
|
||||||
|
for (s32 ch=0; ch<8; ++ch)
|
||||||
|
{
|
||||||
|
if (node->Child[ch]->Triangles.empty())
|
||||||
|
{
|
||||||
|
delete node->Child[ch];
|
||||||
|
node->Child[ch] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
constructOctree(node->Child[ch]);
|
||||||
keepTriangles.push_back(node->Triangles[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
memcpy(node->Triangles.pointer(), keepTriangles.pointer(),
|
|
||||||
sizeof(core::triangle3df)*keepTriangles.size());
|
|
||||||
|
|
||||||
node->Triangles.set_used(keepTriangles.size());
|
|
||||||
keepTriangles.set_used(0);
|
|
||||||
|
|
||||||
if (node->Child[ch]->Triangles.empty())
|
|
||||||
{
|
|
||||||
delete node->Child[ch];
|
|
||||||
node->Child[ch] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
constructOctree(node->Child[ch]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +145,7 @@ void COctreeTriangleSelector::constructOctree(SOctreeNode* node)
|
||||||
void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles,
|
void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles,
|
||||||
s32 arraySize, s32& outTriangleCount,
|
s32 arraySize, s32& outTriangleCount,
|
||||||
const core::aabbox3d<f32>& box,
|
const core::aabbox3d<f32>& box,
|
||||||
const core::matrix4* transform, bool useNodeTransform,
|
const core::matrix4* transform, bool useNodeTransform,
|
||||||
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
|
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
|
||||||
{
|
{
|
||||||
core::matrix4 mat(core::matrix4::EM4CONST_NOTHING);
|
core::matrix4 mat(core::matrix4::EM4CONST_NOTHING);
|
||||||
|
@ -220,7 +229,7 @@ void COctreeTriangleSelector::getTrianglesFromOctree(
|
||||||
// new version: from user Piraaate
|
// new version: from user Piraaate
|
||||||
void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
|
void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
|
||||||
s32& outTriangleCount, const core::line3d<f32>& line,
|
s32& outTriangleCount, const core::line3d<f32>& line,
|
||||||
const core::matrix4* transform, bool useNodeTransform,
|
const core::matrix4* transform, bool useNodeTransform,
|
||||||
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
|
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
|
Loading…
Reference in New Issue