2.1 osg::Referenced 是所有类的基类,作为一个图形平台底层类该如何设计?
Osg的解释是:底层基类、利用引用计数做内存管理(内存回收)。
个人理解:主要目的有两个,一是利用引用计数做内存的自动回收,二是为满足多线程同步的要求。
2.2 osg::ObserverSet 是“观察者”设计模式的应用,为什么设计它呢?
见《C++20设计模型》P192~P203。
2.3 osg::object做为基类,应该包括哪些成员和方法?
2.3.1 它的构造函数、析构函数如何设计
做为基类它的构造和析构是否可以独立于设计模式呢?可以
构造:必须是public、必须有默认构造,其他构造跟基本的必须的成员相关
拷贝构造:一般是=delete,跟内存管理的设计相关(osg是利用引用计数半自动管理)。Osg::object的拷贝构造保留了,要求传入拷贝类型(深拷贝、浅拷贝)
赋值构造:一般是=delete,跟内存管理的设计相关(osg是利用引用计数半自动管理)。Osg::object的Object& operator = (const Object&)被声明成了private(可以理解为=delete)。
析构:一般是private,跟内存管理的设计相关(osg是利用引用计数半自动管理)
2.3.2 复制和引用计数
Osg::object中物体类型的拷贝、物体的拷贝要求子类必须实现
2.3.3 对IO的支持
没看到它对IO的支持呢?!留个疑问
2.3.4 GOF的设计模型
Osg::Object选用GOF 的composite(组合模型),Object是组合模式中抽象component的定义。
2.4 osg::Node
场景树的节点基类,包括以下3部分内容:
1.GOF Composite(组合模式)下要求的接口实现(osg::object中的虚函数),它的角色是“Component”
2.所在树的中的遍历路径ParentList _parents;
3.回调 _updateCallback/_eventCallback/_cullCallback
4.状态集合 ref_ptr _stateset(PS:状态集后面有个小专题)
5.包围盒BoundingSphere _initialBound;
2.5 osg::Group
它在GOF Composite(组合模式)下的角色是“Composite”(树枝),行为定义也是“树枝”角色的典型行为,主要包括:
1.维护子节点列表,addChild/removeChild/insertChild/getChild
2.6 osg::drawable
Osg中所有可渲染的节点均从osg::drawable继承,但它不包含渲染数据的成员且不能被直接当作节点加入场景树,它需要连接到Geode后再加入场景树。渲染Drawable时,必须使用OpenGL的State,osg::StateSet是这些State的体现。
需要注意的是:Drawbale可以被多个不同的Geode连接,StateSet也可以被多个不同的drawable连接。
1.常规函数(构造、override、包围盒、回调)
2._shape (为加速碰撞检测及几何体生成)
3.显示列表 void setSupportsDisplayList(bool flag)/void setUseDisplayList(bool flag);
2.7 osg::geometry
看起来就是普通几何体的定义,成员变量也是普通几何体应该包括的:顶点、法向量、顶点颜色、顶点纹理坐标。
2.8 osg::Geode
继承自osg::Group,在GOF Composite(组合模式)下的角色是“Leaf”(树叶),它被设计用来打包“可渲染”物体(注:从osg::Drawable继承的均属于可渲染物体renderable things)。