[osg-users] Memory leak when using a pixel buffer to generate thumbnails

OpenSceneGraph Users osg-users at lists.openscenegraph.org
Tue Jun 23 07:33:24 PDT 2020


Hi Robert,

I am using code extracted from the osgscreencapture example to generate 
small thumbnails of loaded shapes.
It all work is very nicely except that it is leaking memory on each usage.  
I have commented out our code and based on that and a few other tests I am 
fairly convinced that the leak is the pixel buffer (GraphicsContext) itself.


osg::ref_ptr<osg::GraphicsContext>
createPixelBuffer(int aSize, int aNumSamples)
{
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
    traits->x                                         = 0;
    traits->y                                         = 0;
    traits->width                                     = aSize;
    traits->height                                    = aSize;
    traits->red                                       = 8;
    traits->green                                     = 8;
    traits->blue                                      = 8;
    traits->alpha                                     = 8;
    traits->windowDecoration                          = false;
    traits->pbuffer                                   = true;
    traits->doubleBuffer                              = true;
    traits->sharedContext                             = 0;
    traits->readDISPLAY();
    traits->setUndefinedScreenDetailsToDefaultScreen();

    if (aNumSamples != 0)
    {
        traits->sampleBuffers = 1;
        traits->samples       = aNumSamples;
    }

    return osg::GraphicsContext::createGraphicsContext(traits.get());
}

bool
generateThumbnail(const std::string & aFilePath,
                  const std::string & aThumbnailPath,
                  const std::string & aResourcesPath,
                  int                 aSize,
                  bool                aTopDownView)
{
    auto pixelBuffer = createPixelBuffer(aSize, 8);
    if (!pixelBuffer)
    {
        pixelBuffer = createPixelBuffer(aSize, 0);
    }

//    const auto shape = loadShapeOrError(aFilePath);

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    auto              camera = viewer->getCamera();

    camera->setGraphicsContext(pixelBuffer.get());
    camera->setViewport(new osg::Viewport(0, 0, aSize, aSize));
    camera->setDrawBuffer(GL_BACK);
    camera->setReadBuffer(GL_BACK);

//    setupShapeViewer(viewer, shape.get(), aResourcesPath, aTopDownView);

//    osg::ref_ptr<ImageGrabber> grabber = new ImageGrabber(aThumbnailPath);
//    viewer.getCamera()->setPostDrawCallback(grabber.get());

    viewer->realize();
    viewer->frame();

    return true;
};


If I call the above code repeatedly then it leaks and I cannot understand 
why since everything is in osg:ref_ptr<>. 
The Viewer was a concrete instance originally but that makes no difference.
I have also tried using a slave camera as in the original example.
I have a nasty workaround of extracting a shared pixel buffer and re-using 
it - but ideally this code would be called using std::async, to have 
multiple thumbnails generated in parallel, so that is going to be tricky.

Kinda hoping you can point to my stupid mistake in how I am using osg ;)

Thanks,

Brian


-- 
You received this message because you are subscribed to the Google Groups "OpenSceneGraph Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to osg-users+unsubscribe at googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/osg-users/acdd2682-5b66-4064-aed1-66d2e5c9e3d5o%40googlegroups.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20200623/bd9d58d7/attachment.html>


More information about the osg-users mailing list