[vtk-developers] Bug update : (if anyone is interested)
John Biddiscombe
jbiddiscombe at skippingmouse.co.uk
Fri Apr 27 07:50:28 EDT 2001
Attached is a cxx file which will cause a crash (I hope).
There appear to be two bugs. One I can fix, the other I'm less sure about.
Bug 1).
When Actor is removed from Renderer, its mapper still has graphics
resources allocated
If renderwindow is deleted Mapper's "LastWindow" variable is still pointed
to but is now dead.
Crash occurs in Mapper destructor, when ReleaseGraphicsResources is called
Solution : Add to vtkViewport.cxx :: RemoveProp
ReleaseGraphicsResources(...)
Bug 2). See attached file
As above, but now we Actor->SetMapper(NULL) before removing actor from
renderwindow. Now RemoveProp doesn't call ReleaseGraphicsResources(...)
because Mapper is NULL. crash occurs in destructor as before
Solution: Probably call ReleaseGraphicsResources when Actor has mapper changed.
Comments please. I'm playing with stuff I am not fully qualified to fix. I
understand the issues, but the mappers/renderwindows have many more complex
interactions which you guys at kitware understand better and if we go round
calling releaseGraphicsResources every ten minutes, performance could get a
serious kick in the wotsits.
Also bear in mind, I could be completely wrong.
Thanks
JB
-------------- next part --------------
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkSphereSource.h"
#include "vtkDataSetMapper.h"
#include "vtkActor.h"
//#include "SaveImage.h"
int main( int argc, char *argv[] )
{
char a;
// create a rendering window and renderer
vtkRenderer *ren = vtkRenderer::New();
vtkRenderWindow *renWindow = vtkRenderWindow::New();
renWindow->AddRenderer(ren);
vtkSphereSource *sphere = vtkSphereSource::New();
vtkDataSetMapper *sphereMapper = vtkDataSetMapper::New();
sphereMapper->SetInput(sphere->GetOutput());
vtkActor *sphereActor = vtkActor::New();
sphereActor->SetMapper(sphereMapper);
// assign our actor to the renderer
ren->AddActor(sphereActor);
// draw the resulting scene
renWindow->Render();
// Now that everything is initialized, Clear the mapper
// if this line is removed, the bug disappears.
// WHY ? Because the ReleaseGraphicsResources doesn't get called
// when the mapper is cleared, and instead it happens in the destructor
// solution appears to be to add ReleaseGraphicsResources when
// actor is unhitched from window
//
// in vtkViewPort
// RemoveProp - : Add ReleaseGraphicsResources(...)
// also actor->SetMapper(...) should call same?
sphereActor->SetMapper(NULL);
// loop until key is pressed
cout << "Press any key followed by <Enter> to exit>> ";
cin >> a;
sphere->Delete();
// Now remove the actor from the renderer
ren->RemoveActor(sphereActor);
// Now delete the window and renderer
renWindow->Delete();
ren->Delete();
// Now delete the actor
sphereActor->Delete();
// And now the mapper should have a dangling pointer which will cause a crash
sphereMapper->Delete();
}
More information about the vtk-developers
mailing list