osg.DeleteHandler是OpenSceneGraph的一个类,它是用来管理图形模型数据的内存释放的。当我们使用OpenSceneGraph创建了大量的图形数据对象时,为了不造成内存泄漏,我们需要将这些对象及其依赖的数据释放掉,这就是osg.DeleteHandler所要解决的问题。
osg.DeleteHandler是遵循单例模式的,我们在程序的任何地方都可以通过osg::DeleteHandler::instance()获取到唯一的实例。
osg.DeleteHandler还支持自定义各种类型的数据的删除函数,我们只需要实现一个适配器即可。
osg::DeleteHandler& instance()
获取osg.DeleteHandler的唯一实例。
virtual void operator()(Object* obj) const
释放obj所占用的内存,该函数为纯虚函数,具体实现需要由派生类实现。
virtual void add(Object* obj)
将obj加入到osg.DeleteHandler中管理的数据对象中。
virtual void remove(Object* obj)
从osg.DeleteHandler中移除obj。
virtual void flushAllDeletedObjects()
释放所有已标记为删除的对象所占用的内存。
virtual void setStackedDelete(bool stacked)
设置是否使用堆栈删除。
virtual bool getStackedDelete() const
获取当前是否使用堆栈删除。
virtual void setNumFramesToRetainObjects(unsigned int numFrames)
设置需要保留的帧数,该帧数比当前帧数小的对象将被释放。
virtual unsigned int getNumFramesToRetainObjects() const
获取当前需要保留的帧数。
void registerAndDeleteAssociatedOpenGLObjects(Object* obj)
注册obj的关联的OpenGL对象,并在obj被删除时一并释放这些OpenGL对象。
void addDeleteMethod(void (method)(Object))
注册自定义的数据类型的删除函数。
void removeDeleteMethod(void (method)(Object))
移除自定义的数据类型的删除函数。
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vertexArray = new osg::Vec3Array;
geometry->setVertexArray(vertexArray.get());
osg::DeleteHandler::instance()->add(geometry.get());
osg::DeleteHandler::instance()->add(vertexArray.get());
//...使用geometry和vertexArray...
geometry = nullptr; //手动释放资源
vertexArray = nullptr; //手动释放资源
osg::DeleteHandler::instance()->flushAllDeletedObjects(); //释放所有已删除的对象所占用的内存