Hi Peinman, Looking at your code the performance problems have little to do with OpenGL and the OSG and everything to with creating a new callback on every frame and writing to disk from the main thread, File IO is very expensive so absolutely not something you want to do in main rendering thread. The start/stop of threading and releaseContext() is rather odd too, I can't think what you are trying to achieve here.
What you should do is create a single callback that you can toggle on/off when needed and have it generate an image write operation that it dispatches to a back ground thread that does the writing to disk. Ideally you'd recycle the images once you've finished. If this all sounds a bit involved, well what you are trying to do is reasonable advanced stuff, you are rather diving into the deep end without armbands having not learnt to swim yet... Robert. On 27 January 2016 at 14:27, Peiman Shakeri <[email protected]> wrote: > Hi, > this is a part of my source > I cut unnecessary part cause of clarification > > Thank you! > > Cheers, > Peiman > > source: > > > Code: > > void VisSystem::CreateArea( ) > { > city=new CityArea(); > city->Create(false,7); > root->addChild(weather->group); > root->addChild(weather->skyLightSource); > city->setLight(weather->skyLight); > SystemData::getInstance()->area=city; > root->addChild(city->areaGroup->getChild(0)); > rootRear=new osg::Group; > rootRear->addChild(weather->skyLightSource); > rootRear->addChild(weather->group); > rootRear->addChild(city->areaGroup->getChild(1)); > > > viewer.Create(); > viewer.CreateLeftSide(); > viewer.CreateRightSide(); > > viewer.AddfrontScene(root); > viewer.AddfrontScene(city->TrafficGroup); > viewer.AddRearScene(rootRear); > viewer.AddRearScene(city->TrafficGroup); > > > viewer.CreateTopview(); > viewer.AddTopScene(root); > viewer.AddTopScene(city->TrafficGroup); > viewer.AddTopScene(city->TrafficGroup2); > > > } > > void VisSystem::Run(void) > { > CreateArea(); > > > std::string fileName; > osgDB::DatabasePager* pager = viewer.Topview->getDatabasePager(); > pager->setDoPreCompile(true); > osg::ref_ptr<CustomRenderer> customRenderer = new > CustomRenderer(viewer.Topview->getCamera()); > viewer.Topview->getCamera()->setRenderer(customRenderer.get()); > customRenderer->setCullOnly(false); > GLenum buffer = > viewer.Topview->getCamera()->getGraphicsContext()->getTraits()->doubleBuffer > ? GL_BACK : GL_FRONT; > > viewer.TopRTT->RTTCam->setDrawBuffer(buffer); > viewer.TopRTT->RTTCam->setReadBuffer(buffer); > > const osg::FrameStamp* fs2 = viewer.Topview->getFrameStamp(); > > osg::ref_ptr<osg::Image> posterImage = 0; > posterImage = new osg::Image; > > bool outputPoster = true, outputTiles = false; > int tileWidth = 640, tileHeight = 480; > int posterWidth = 640, posterHeight = 480; > int numCameras = 1; > std::string posterName = "poster.bmp", extName = "bmp"; > char filename[50]; > int i=1; > > > IplImage *iplimg = cvCreateImage(CvSize(640,480),IPL_DEPTH_8U,3); > > CvSize size; > int isColor = 1; > int fps = 25; // or 30 > > size.width = 640; > size.height = 480; > > CvVideoWriter *writer = cvCreateVideoWriter( > "D:\\PEIMAN\\video\\test.avi", > CV_FOURCC('P','I','M','1'),//CV_FOURCC('I','Y','U','V'), // VIDEO CODEC > fps, > size); > > while(writer == NULL) > { > writer = cvCreateVideoWriter( > "D:\\PEIMAN\\video\\test.avi", > CV_FOURCC('P','I','M','1'),//CV_FOURCC('I','Y','U','V'), // VIDEO CODEC > fps, > size); > > } > > viewer.viewer.realize(); > viewer.viewer.stopThreading(); > viewer.Topview->getCamera()->getGraphicsContext()->releaseContext(); > viewer.viewer.startThreading(); > > while(!viewer.viewer.done()) > { > //updating stuff > > viewer.viewer.frame(); > > > std::ostringstream os; > std::string snum; > os<<fs2->getFrameNumber(); > snum=os.str(); > fileName="D:\\PEIMAN\\image\\poster"+snum+".bmp"; > char* Fname=new char[fileName.size()+1]; > std::copy(fileName.begin(),fileName.end(),Fname); > Fname[fileName.size()]='\0'; > std::cout<<Fname<<std::endl; > viewer.viewer.renderingTraversals(); > viewer.Topview->getCamera()->setFinalDrawCallback( new > WindowCaptureCallback(buffer, fileName,posterImage.get())); > > if ( (fs2->getFrameNumber()%2)==0 ) > { > > iplimg->imageData=(char*)posterImage->data(); > cvCvtColor(iplimg,iplimg,CV_BGR2RGB); > cvFlip(iplimg, iplimg, 0); > cvWriteFrame(writer,iplimg); > > } > > > > > } > > cvReleaseVideoWriter(&writer); > cvReleaseImage(&iplimg); > > } > > > > > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=66152#66152 > > > > > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org _______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

