程序结束后osgViewer::Viewer还在运行代码
时间: 2024-02-12 16:09:23 浏览: 78
监视程序进程关闭后再执行代码
4星 · 用户满意度95%
以下是一个简单的程序结束后强制释放osgViewer::Viewer资源的示例代码:
```
#include <osgViewer/Viewer>
#include <osg/Geode>
#include <osg/ShapeDrawable>
int main(int argc, char** argv)
{
// 创建视图器对象
osgViewer::Viewer viewer;
// 创建场景图
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0, 0, 0), 1.0f);
osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(sphere);
geode->addDrawable(drawable);
// 添加场景图到视图器
viewer.setSceneData(geode);
// 运行视图器
viewer.run();
// 停止渲染
viewer.setDone(true);
// 停止视图器线程
viewer.stopThreading();
// 确保OpenGL上下文是当前的
viewer.realize();
// 手动触发一次渲染
viewer.frame();
// 释放OpenGL上下文
viewer.releaseContext();
// 等待一段时间,确保所有OpenThreads线程都已经退出
OpenThreads::Thread::microSleep(1000);
// 删除对象
viewer.setSceneData(nullptr);
viewer.getCamera()->setGraphicsContext(nullptr);
viewer.getCamera()->setViewport(nullptr);
viewer.setCameraManipulator(nullptr);
viewer.setScene(nullptr);
viewer.setCamera(nullptr);
// 强制回收内存
osg::Referenced::setThreadSafeReferenceCounting(false);
osg::Referenced::setThreadSafeDeleteHandler(new osg::DeleteHandler);
return 0;
}
```
这个程序创建了一个简单的场景图,并在视图器中运行,待程序结束后,通过调用`viewer.setDone(true)`等方法强制停止渲染,并手动触发一次渲染,最后删除视图器对象并强制回收内存。需要注意的是,在删除视图器对象之前,需要将与之相关的资源全部释放,包括场景图、相机、视口等,以及调用`viewer.releaseContext()`方法释放OpenGL上下文。
阅读全文