osgEarth的Rex引擎原理分析(三十四)资源释放器子节点的作用

目标:(十二)中的问题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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值