【osg】viewer.run()与viewer.frame()在使用上的区别

先写结论:加上场景漫游器

	viewer.setCameraManipulator(new osgGA::TrackballManipulator());

 

1 背景

实验需要测帧率并输出

while (!viewer.done())
	{
		if (counts == 0) {
			start_frame_time = timer->tick();
		}
		counts++;
		viewer.frame();

		if (counts == 3)
		{
			counts = 0;
			end_frame_time = timer->tick();
			fout << "当前帧速为: " << 3 / timer->delta_s(start_frame_time, end_frame_time) << std::endl;
		}
	}

上述代码在测试时候,场景中除了HUDtext其他地形视频啥的都没有加进去,改成viewer.run(),可以正常运行场景,但是输出不了帧率(必然输出不了,因为run一次渲染完成,while只循环了一次,counts没有机会等于3),那么问题就出在viewer.frame()上。

2 解决思路

找到run和frame函数的源码,结合OSG:从源码看Viewer::run()

场景的run中首先会判断该场景中有没有漫游器(getCameraManipulator返回一个osgGA::CameraManipulator),如果该场景中不存在漫游器,则调用函数setCameraManipulator创建一个跟踪球 TrackballManipulator的场景漫游器。

frame只负责渲染工作,所以场景需要加上漫游器。

 

上一篇:H7-TOOL高速DAPLINK推出离线版SEGGER RTT打印功能,简单易用,支持中文


下一篇:如何查看XPS文件