osg.SyncSwapBuffersCallback
是一个回调函数对象,用于在OpenSceneGraph中同步交换缓冲区的操作。
在渲染场景之后,OpenSceneGraph会调用一个函数来进行缓冲区交换(swap buffers)操作,将渲染好的场景展示到屏幕上。osg.SyncSwapBuffersCallback
可以让这个交换缓冲区的操作同步到垂直同步信号(VSync)的节拍上,以解决显示器撕裂(tearing)的问题。
SyncSwapBuffersCallback()
virtual void syncSwapBuffers(osg::State& state) const
在交换缓冲区之前调用,可以在此处同步到VSync信号。默认的实现不做任何操作。
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->windowName = "Hello, World!";
traits->screenNum = 0;
traits->doubleBuffer = true;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
osgViewer::Viewer viewer;
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
viewer.getCamera()->setGraphicsContext(gc.get());
viewer.getCamera()->setClearColor(osg::Vec4(0.2,0.2,0.6,1.0));
viewer.getCamera()->setViewport(new osg::Viewport(0,0,traits->width,traits->height));
osg::ref_ptr<osg::SyncSwapBuffersCallback> ssbc = new osg::SyncSwapBuffersCallback;
viewer.getCamera()->setPostDrawCallback(ssbc.get());
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
viewer.setSceneData(model.get());
while(!viewer.done()) {
viewer.frame();
}
在上面的示例中,我们创建了一个视窗,将osg.SyncSwapBuffersCallback
添加到了相机的post draw
回调中,以同步交换缓冲区操作。同时我们还加载了一个cow.osg
文件作为场景数据。最后,我们调用viewer.frame()
来渲染场景并交换缓冲区。
[1] OpenSceneGraph 3.6文档,https://openscenegraph.github.io/documentation/3.6.5/reference-docs/namespaceosg.html#aeeb5d40dd89e849b50af42d5c5edb926