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之后析构。