Hi Antonio,

yes you are right there are some places in OpenSG where the reference 
counting is not implemented e.g. the Window and Viewport classes. 
Actually this is a bug, we should fix it but this could lead to crashes 
on apps that know about this "feature" ;-)

Andreas

> Hi Andreas,
> 
> late response, but I just got into it right now:
> 
> Andreas Zieringer wrote:
> 
>> Hi Antonio,
>>
>>> Hi,
>>>
>>> just a quick question, why is this code leaking
>>> memory:
>>>
>>> while( true ){
>>>      beginEditCP(m_pFBO, FBOViewport::CameraFieldMask);
>>>          m_pFBO->setCamera(PerspectiveCamera::create());
>>>      endEditCP(m_pFBO, FBOViewport::CameraFieldMask);
>>> }
>>>
>>> ???
>>>
>>> Shouldn't the setCamera method destroy implicitly the old
>>> camera set on the viewport (he should hold the last
>>> reference to the old camera!)
>>
>>
>> yes, try this: Thread::getCurrent()->getChangeList()->clearAll();
> 
> 
> It doesn't work as I expect it to work. I attached a modified
> version of the first tutorial. In each render loop it creates
> some osg instances. When you press <esc> it prints a list of
> non deallocated instances. All instances created in the loop
> are still alive. Only calling explicitly subRefCP frees the
> memory. Doing something like:
> 
> PassiveBackgroundPtr pw;
> 
> while( true )
>     pw = PassiveBackground::create();
> 
> leads to memory leaks. Also calling getChangeList()->clearAll()
> doesn't help much. Is this behaviour by design?
> 
> Regards,
> 
>   Toni
> 
> 
> ------------------------------------------------------------------------
> 
> // OpenSG Tutorial Example: Hello World
> //
> // Minimalistic OpenSG program
> // 
> // This is the shortest useful OpenSG program 
> // (if you remove all the comments ;)
> //
> // It shows how to use OpenSG together with GLUT to create a little
> // interactive scene viewer.
> //
> 
> // GLUT is used for window handling
> #include <OpenSG/OSGGLUT.h>
> 
> // General OpenSG configuration, needed everywhere
> #include <OpenSG/OSGConfig.h>
> 
> // Methods to create simple geometry: boxes, spheres, tori etc.
> #include <OpenSG/OSGSimpleGeometry.h>
> 
> // The GLUT-OpenSG connection class
> #include <OpenSG/OSGGLUTWindow.h>
> 
> // A little helper to simplify scene management and interaction
> #include <OpenSG/OSGSimpleSceneManager.h>
> #include <OpenSG/OSGPassiveBackground.h>
> #include <OpenSG/OSGPerspectiveCamera.h>
> #include <OpenSG/OSGViewport.h>
> 
> 
> // Activate the OpenSG namespace
> // This is not strictly necessary, you can also prefix all OpenSG symbols
> // with OSG::, but that would be a bit tedious for this example
> OSG_USING_NAMESPACE
> 
> // The SimpleSceneManager to manage simple applications
> SimpleSceneManager *mgr;
> 
> // forward declaration so we can have the interesting stuff upfront
> int setupGLUT( int *argc, char *argv[] );
> 
> PassiveBackgroundPtr dummyPB;
> NodePtr dummyNode;
> ViewportPtr dummyVP;
> 
> UInt32 fcStoreSize;
> 
> void printOSGInstances()
> {
>     const std::vector<FieldContainerPtr> &fcs = 
> *FieldContainerFactory::the()->getFieldContainerStore();
> 
>     int notNull = 0;
>     for(int i=fcStoreSize;i<fcs.size();++i)
>     {
>         FieldContainerPtr fc = fcs[i];
>         if(fc != NullFC)
>         {
>             notNull++;
>             printf( "Detected living FC %s!\n", fc->getTypeName());
>         }
>     }
> 
>     printf( "%d out of %d FC's are not destroyed\n", notNull, 
> fcs.size()-fcStoreSize );
> }
> 
> // Initialize GLUT & OpenSG and set up the scene
> int main(int argc, char **argv)
> {
>     // OSG init
>     osgInit(argc,argv);
>  
>     fcStoreSize = 
> FieldContainerFactory::the()->getFieldContainerStore()->size();
> 
>     // GLUT init
>     int winid = setupGLUT(&argc, argv);
> 
>     // the connection between GLUT and OpenSG
>     GLUTWindowPtr gwin= GLUTWindow::create();
>     gwin->setId(winid);
>     gwin->init();
> 
>     // create the scene
>     NodePtr scene = makeTorus(.5, 2, 16, 16);
> 
>     dummyVP = Viewport::create();
>     // create the SimpleSceneManager helper
>     mgr = new SimpleSceneManager;
> 
>     // tell the manager what to manage
>     mgr->setWindow(gwin );
>     mgr->setRoot  (scene);
> 
>     // show the whole scene
>     mgr->showAll();
>     
>     // GLUT main loop
>     glutMainLoop();
> 
>     return 0;
> }
> 
> //
> // GLUT callback functions
> //
> 
> // redraw the window
> void display(void)
> {
> 
>     dummyPB = PassiveBackground::create();
>     dummyNode = Node::create();
> 
> 
>     beginEditCP(dummyVP, Viewport::CameraFieldMask);
>         dummyVP->setCamera(PerspectiveCamera::create());
>     endEditCP(dummyVP, Viewport::CameraFieldMask);
> 
> 
>     Thread::getCurrent()->getChangeList()->clearAll();
> 
>     // usign subref works ok!
>     //subRefCP( dummyPB );
>     //subRefCP( dummyNode );
> 
>     mgr->setRoot  (makeTorus(.5, 2, 16, 16));
> 
>     mgr->redraw();
>     
>     Thread::getCurrent()->getChangeList()->clearAll();
> }
> 
> // react to size changes
> void reshape(int w, int h)
> {
>     mgr->resize(w, h);
>     glutPostRedisplay();
> }
> 
> // react to mouse button presses
> void mouse(int button, int state, int x, int y)
> {
>     if (state)
>         mgr->mouseButtonRelease(button, x, y);
>     else
>         mgr->mouseButtonPress(button, x, y);
>         
>     glutPostRedisplay();
> }
> 
> // react to mouse motions with pressed buttons
> void motion(int x, int y)
> {
>     mgr->mouseMove(x, y);
>     glutPostRedisplay();
> }
> 
> // react to keys
> void keyboard(unsigned char k, int x, int y)
> {
>     switch(k)
>     {
>         case 27:        
>         {
>             delete mgr;
>             Thread::getCurrent()->getChangeList()->clearAll();
>             OSG::osgExit();
>             printOSGInstances();
>             Sleep(10000);
>             exit(0);
>         }
>         break;
>     }
> }
> 
> // setup the GLUT library which handles the windows for us
> int setupGLUT(int *argc, char *argv[])
> {
>     glutInit(argc, argv);
>     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
>     
>     int winid = glutCreateWindow("OpenSG");
>     
>     glutReshapeFunc(reshape);
>     glutDisplayFunc(display);
>     glutMouseFunc(mouse);
>     glutMotionFunc(motion);
>     glutKeyboardFunc(keyboard);
> 
>     return winid;
> }
> 
> 
> ------------------------------------------------------------------------
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Opensg-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensg-users


-- 
VREC
Robert-Bosch-Straße 7
D-64293 Darmstadt
Tel. 06151-4921035

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to