我正在阅读有关Octrees的this文章,我注意到作者使用字节变量来保存有关每个Octree节点的活动子节点的信息。
byte m_activeNodes = 0;
然后他按如下方式使用
//Create child nodes
for (int a = 0; a < 8; a++)
{
if (octList[a].Count != 0)
{
m_childNode[a] = CreateNode(octant[a], octList[a]);
m_activeNodes |= (byte)(1 << a);
m_childNode[a].BuildTree();
}
}
然后在其余代码中,每当他想检查是否存在八叉树的活动节点时,他首先检查m_activeNodes
,然后无忧无虑地访问m_childNode[index]
。
例如:
//recursively update any child nodes.
for( int flags = m_activeNodes, index = 0; flags > 0; flags >>=1, index++)
if ((flags & 1) == 1) m_childNode[index].Update(gameTime);
作者用C#编码,而不是用C ++编写代码,但我知道我只是将非活动节点设置为nullptr
,然后在访问之前检查m_childNodes[index] == nullptr
是否正确。
所以我的问题是他的方法是否比我的方法更有效,如果没有,它有什么好处。
答案 0 :(得分:2)
字节字段不作为&#34;安全检查&#34; - 它作为优化。它为他提供了一个简单的检查,以确定当前节点是否是一个叶节点(没有子节点),而无需单独检查每个子指针。
即使有叶节点,该字段也允许循环在找到最后一个子节点后立即终止,而不是检查所有8个潜在的子节点。