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 中,SetInputConnection、SetSourceConnection、AddRenderer 、SetMapper这类函数之所以会增加引用计数,是因为它们让调用对象“持有”了被传进来的对象。为了确保被持有的对象在持有期间不被意外销毁,持有者会调用它的 Register() 增加其引用计数。
哪些类型的函数会增加引用计数?
凡是让一个对象长期依赖/拥有另一个对象的方法,几乎都会增加引用计数。常见类型包括:
-
管道连接类
SetInputConnection、SetInputData、SetInputArrayToProcess、SetSourceConnection等。过滤器需要保证它的输入(生产者)存活。 -
渲染体系类
-
渲染窗口添加渲染器:
AddRenderer -
渲染器添加可绘制对象:
AddActor、AddVolume、AddLight、AddViewProp -
Actor 设置映射器:
SetMapper(actor 会持有 mapper) -
Actor 设置纹理:
SetTexture -
相机设置:
vtkRenderer::SetActiveCamera
-
-
集合/组合类
-
vtkCollection::AddItem及其子类(如vtkPropCollection::AddItem、vtkActorCollection::AddItem) -
vtkAssembly::AddPart(装配体增加零件) -
vtkPropPicker::AddPickList
-
-
显式设置长期从属对象
-
vtkProp3D::SetUserTransform(增加对变换对象的引用) -
vtkWidgetRepresentation::SetRenderer -
vtkAbstractWidget::SetRepresentation
-
-
复合数据集
-
vtkMultiBlockDataSet::SetBlock -
vtkPartitionedDataSet::SetPartition -
各种
AddDataSet类方法
-
-
其他设置属性/回调的对象
-
某些设置回调函数对象的方法(如
SetCallback,若接受vtkObject) -
设置文本属性等,如
vtkCaptionActor2D::SetCaptionTextProperty
-
基本规律:如果文档或注释里出现 “接管”、“持有”、“设置” 某个 VTK 对象的指针,且该对象会被用于长期操作,它通常就会增加引用计数。

237

被折叠的 条评论
为什么被折叠?



