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

本文深入探讨osgEarth的Rex引擎中资源释放器子节点的角色,它在setMap方法中创建,用于在osgUtil::SceneView::draw时释放过期的OpenGL资源。资源释放器通过引用计数管理瓦片节点,确保在正确时机释放内存,同时解释了osg::State在释放OpenGL资源中的作用。

目标:(十二)中的问题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() &l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值