OpenSceneGraph 内存管理

OpenSceneGraph memory management

我最近开始使用 OpenSceneGraph。我想知道它如何处理内存管理(如果有的话)。例如,我们有几何 class。几何 class 接受顶点、颜色、纹理坐标的数组,正如您所期望的那样。除了,它期望这些东西作为指向对象的指针:

void Geometry::setVertexArray(Array* array)
{
    if (array && array->getBinding()==osg::Array::BIND_UNDEFINED) array->setBinding(osg::Array::BIND_PER_VERTEX);

    _vertexArray = array;

    dirtyDisplayList();
    dirtyBound();

    if (_useVertexBufferObjects && array) addVertexBufferObjectIfRequired(array);
}

这来自 OpenSceneGraph 源代码。如您所见,一个 Array* 被传递给该方法,该方法应由用户分配。如果是这样,谁删除它?显然不是 OSG(这是有道理的),因为我们可以看到它在分配新数组指针时盲目地覆盖了最后一个数组指针。这很好,但是现在用户必须确保他们分配的数组比几何 class 更长。此外,对于用户提供此几何对象的每个数组,他们必须保留对此数组的引用。

这给我们留下了大量的指针,只有在删除对象后才能删除这些指针。结果是我发现这使用起来非常麻烦。我在这里错过了什么吗?为什么系统要这样设计?

osg::ref_ptr<Array>             _vertexArray;

_vertexArray 在header 中是这样定义的。这意味着当它在该方法中分配给数组时,引用计数将增加到 1。当引用被删除时,计数将变为 0 并将删除 object.

这意味着您不能依赖几何 object 之外的数组数据,除非您还将数组定义为 ref_ptr。这非常令人困惑,让我想知道为什么他们没有将参数设置为 ref_ptr。

我确信这会导致一些难以理解的问题,但我想规则是如果你要传递它,就不要依赖 non-ref 指针。这可能适用于您盲目创建 object 并立即将其传递给方法的情况,但我希望 OSG 能更清楚地说明这一点。