C++中最通用的删除对象的方法是delete,OSG 的智能指针也是采用这种方式来释放对
象的,不过由于OSG采用多线程更新/渲染的方式(这一点我们会在后面的日子中详细介绍),
这样做可能带来会某些隐患,想象这样一种情况:
1、场景某个的节点负责显示某种图形,它的工作一直很正常;
2、我们采用DrawThreadPerContext 或者CullThreadPerCameraDrawThreadPerContext 线
程模型,根据前一日中我们所知的,这两种模式中存在“上次的渲染工作与下次的更新工作
交叠”这一情形。
3、假设我们在更新工作中立即将这个节点删除,而上次渲染工作可能正要将这个节点
来引用(ref)图形节点,然后在渲染结束取消引用(unref),这样不就可以避免无谓的牺牲
了吗?也省却用户的很多麻烦。
说得有道理,不过这其中恐怕忽视了一个核心的问题:渲染效率。是的,假设我们要渲
染成千上万个这样的几何体节点(这对您来说也
象的,不过由于OSG采用多线程更新/渲染的方式(这一点我们会在后面的日子中详细介绍),
这样做可能带来会某些隐患,想象这样一种情况:
1、场景某个的节点负责显示某种图形,它的工作一直很正常;
2、我们采用DrawThreadPerContext 或者CullThreadPerCameraDrawThreadPerContext 线
程模型,根据前一日中我们所知的,这两种模式中存在“上次的渲染工作与下次的更新工作
交叠”这一情形。
3、假设我们在更新工作中立即将这个节点删除,而上次渲染工作可能正要将这个节点
中的数据送往OpenGL 图形渲染管线,那么灾难就发生了……
来引用(ref)图形节点,然后在渲染结束取消引用(unref),这样不就可以避免无谓的牺牲
了吗?也省却用户的很多麻烦。
说得有道理,不过这其中恐怕忽视了一个核心的问题:渲染效率。是的,假设我们要渲
染成千上万个这样的几何体节点(这对您来说也