目标:(十二)中的问题19
资源释放器器子节点在rex引擎的setMap中创建,用于释放过期对象的opengl资源
osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options)
{
// A resource releaser that will call releaseGLObjects() on expired objects.
_releaser = new ResourceReleaser();
this->addChild(_releaser.get());
}
由(三十三)可知
对要移除的瓦片节点,放入资源释放器(本质是osg::Drawable对象),释放分配的opengl资源。并不是立即释放,而是要等到osgUtil::SceneView::draw时最终调用资源释放器的drawImplementation时进行释放,该draw不一定在帧循环中调用。资源释放器通过引用指针的方式管理要释放的瓦片节点,因此(3)中的移除不会真正从内存中移除,只有资源释放器移除后才会真正从内存中移除。
osgEarth/ResourceReleaser.cpp
void
ResourceReleaser::releaseGLObjects(osg::State* state) const
{
osg::Drawable::releaseGLObjects(state);
if (!_toRelease.empty())
{
Threading::ScopedMutexLock lock(_mutex);
if (!_toRelease.empty())
{
METRIC_SCOPED("ResourceReleaser");
for (ObjectList::const_iterator i = _toRelease.begin(); i != _toRelease.end(); ++i)
{
osg::Object* object = i->get();
object->releaseGLObjects(state);
}
OE_DEBUG << LC << "Released " << _toRelease.size() << " objects\n";
_toRelease.clear();
}
}
}
osgEarthDrivers/engine_rex/TileNode.cpp
void
TileNode::releaseGLObjects(osg::State* state) const
{
osg::Group::releaseGLObjects(state);
if ( _surface.valid() )
_surface->releaseGLObjects(state);
if ( _patch.valid() )
_patch->rele