vtk的Reference count简析

       vtkRenderWindow* renWin = vtkRenderWindow::New();
       char jniS[4] = { 'j','n','i',0 };
       renWin->SetWindowInfo(jniS); // tell the system that jni owns the window not us
       renWin->SetSize(100, 100);
       {
           vtkNew<vtkRenderer> renderer; //vtkNew构造,ReferenceCount++
           renderer->Print(std::cout); //当前的Reference Count: 1

           /*
           调用Addxxx到一个collection的时候 会调用Register,因此ReferenceCount++
           */
           renWin->AddRenderer(renderer.Get());

           renderer->Print(std::cout); //当前Reference Count: 2

           //vtkNew会析构,ReferenceCount--,add到collection里面的Reference Count: 1
       }

       vtkRendererCollection* c = renWin->GetRenderers();
       c->GetFirstRenderer()->Print(std::cout);//当前的Reference Count: 1

       vtkNew<vtkSphereSource> sphere;
       sphere->SetThetaResolution(8);
       sphere->SetPhiResolution(8);

       vtkNew<vtkConeSource> cone;
       cone->SetResolution(6);

       vtkNew<vtkGlyph3D> glyph;
       /*
       调用SetInputConnection和SetSourceConnection的时候,
       会调用Register,因此ReferenceCount++
       
       */
       glyph->SetInputConnection(sphere->GetOutputPort());
       glyph->SetSourceConnection(cone->GetOutputPort());
       sphere->Print(std::cout); //当前Reference Count: 2
       cone->Print(std::cout); //当前Reference Count: 2

       glyph->SetVectorModeToUseNormal();
       glyph->SetScaleModeToScaleByVector();
       glyph->SetScaleFactor(0.25);

       vtkNew<vtkPolyDataMapper> spikeMapper;
       spikeMapper->SetInputConnection(glyph->GetOutputPort());
       cone->Print(std::cout); //当前Reference Count: 2
       glyph->Print(std::cout); //当前Reference Count: 2

       vtkNew<vtkPolyDataMapper> spikeMapper;
       spikeMapper->SetInputConnection(glyph->GetOutputPort());

       vtkNew<vtkActor> spikeActor;
       /*
       调用SetMapper的时候会调用Register,因此ReferenceCount++
       */
       spikeActor->SetMapper(spikeMapper.Get());
       spikeMapper->Print(std::cout); //Reference Count: 2


   }

在 VTK 中,SetInputConnectionSetSourceConnectionAddRenderer 、SetMapper这类函数之所以会增加引用计数,是因为它们让调用对象“持有”了被传进来的对象。为了确保被持有的对象在持有期间不被意外销毁,持有者会调用它的 Register() 增加其引用计数。

哪些类型的函数会增加引用计数?

凡是让一个对象长期依赖/拥有另一个对象的方法,几乎都会增加引用计数。常见类型包括:

  • 管道连接类
    SetInputConnectionSetInputDataSetInputArrayToProcessSetSourceConnection 等。过滤器需要保证它的输入(生产者)存活。

  • 渲染体系类

    • 渲染窗口添加渲染器:AddRenderer

    • 渲染器添加可绘制对象:AddActorAddVolumeAddLightAddViewProp

    • Actor 设置映射器:SetMapper(actor 会持有 mapper)

    • Actor 设置纹理:SetTexture

    • 相机设置:vtkRenderer::SetActiveCamera

  • 集合/组合类

    • vtkCollection::AddItem 及其子类(如 vtkPropCollection::AddItemvtkActorCollection::AddItem

    • vtkAssembly::AddPart (装配体增加零件)

    • vtkPropPicker::AddPickList

  • 显式设置长期从属对象

    • vtkProp3D::SetUserTransform (增加对变换对象的引用)

    • vtkWidgetRepresentation::SetRenderer

    • vtkAbstractWidget::SetRepresentation

  • 复合数据集

    • vtkMultiBlockDataSet::SetBlock

    • vtkPartitionedDataSet::SetPartition

    • 各种 AddDataSet 类方法

  • 其他设置属性/回调的对象

    • 某些设置回调函数对象的方法(如 SetCallback,若接受 vtkObject

    • 设置文本属性等,如 vtkCaptionActor2D::SetCaptionTextProperty

基本规律:如果文档或注释里出现 “接管”、“持有”、“设置” 某个 VTK 对象的指针,且该对象会被用于长期操作,它通常就会增加引用计数。

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值