最近在实现鼠标捡取对象时,需要实时计算射线与三角形是否相交。
涉及到了数据结构为AABB树,具体参考http://www.codercorner.com/Opcode.htm
为了测试内存的使用,选取的测试用例为220w的三角形面片的模型。
一开始自己创建的节点类为:
class AABBTreeNode
{
//*************
float *box;//当前节点的包围盒
int *m_NodePrimitives;
int mNbPrimitives;
AABBTreeNode *left;
AABBTreeNode *right;
}
构造过程中不断的new出包围盒的数据
同时在构造树的递归过程中,不断的new左右子树指针。
刚开始的内存占用为:总共700M左右
实在难以承受。
然后参考OPCODE实现思路
class AABBTreeNode
{
//*************
float box[6];//当前节点的包围盒</span>
int *m_NodePrimitives;
int mNbPrimitives;
AABBTreeNode *left;
AABBTreeNode *right;
}
经过这个步骤内存降了100M左右。
同时在构造节点过程中预先new出内存:
AABBTreeNode *root = new AABBTreeNode[2 * mNbPrimitives-1];
此时内存总共占用约为230M
实在很夸张,记下来,防止以后犯类似错误。