osgViewer销毁bug

osgViewer的析构函数中会调用GraphicsContext::close();GraphicsContext::close()中会 释放分配的显示列表;而osgViewer的基类中osg::View的析构函数中才会删除Camera节点,这样就造成一些显示列表没有被释放的问题。

 

osg中删除显示列表时,并不真正删除,而是缓存起来,下次再分配时,会根据显示列表的大小重新使用。

 

osg中会为GraphicsContext分配一个ID,这个ID在GraphicsContext删除会,下次创建的GraphicsContext会再次使用。

osg::Drawable 会记录GraphicsContext ID中删除的显示列表(并未真正删除),如果在调用GraphicsContext::close()时一些分配的显示列表没有删除,新创建的 GraphicsContext中会出现一些显示列表无效的问题。

 

解决方法:

1. osgViewer的析构函数前释放Camera节点。

pViewer->setCamera(NULL);

pViewer->setSceneData(NULL);

2. GraphicsContext在osgViewer之后析构。

 

posted @ 2013-10-25 21:47  -lw-  阅读(622)  评论(0编辑  收藏  举报