这次分析一下OSG中的的osg::FrameStamp类和osg::Timer类,在OSG中的源码中这两个类的用法随处可见,但是一直没仔细阅读过它的源码,这次因为需要查到了这儿仔细阅读了一下,希望记录下来以后查阅时方便些。
1.osg::FrameStamp类
osg::FrameStamp这个类中准确的说只有四个成员变量,它的方法都是这些成员变量的get方法和set方法。
前三个成员变量如下,很好理解:
unsigned int _frameNumber; //这个成员变量用来记录帧号
double _referenceTime;//这个成员变量用来记录仿真开始了多少时间,下面会详细讲解
double _simulationTime;//这个成员变量还没搞明白它的用法,但是默认情况下和_referenceTime是一样的
我把剩下的这些成员变量称为第四个成员变量,用过C++中tm结构的都知道这些变量和tm结构体中的成员是统一的:
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year. [0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
至于为什么要把tm结构体中的成员变量都列举出来源码中也说了,是为了保证FrameStamp类中的所有的成员变量都不是动态分配的,这样通过网络在不同的操作系统中传输数据时就不会有问题。
FrameStamp中的函数都是针对这些成员变量的操作:
对_frameNumber的操作:
void setFrameNumber(unsigned int fnum) { _frameNumber = fnum; }
unsigned int getFrameNumber() const { return _frameNumber; }
对_referenceTime的操作:
void setReferenceTime(double refTime) { _referenceTime = refTime; }
double getReferenceTime() const { return _referenceTime; }
对_simulationTime的操作:
void setSimulationTime(double refTime) { _simulationTime = refTime; }
double getSimulationTime() const { return _simulationTime; }
以及对我所说的第四个成员变量的操作,这个成员变量姑且叫做日历时间吧:注意这里无论是get还是set方法参数都是tm结构体类型了
void setCalendarTime(const tm& calendarTime);
void getCalendarTime(tm& calendarTime) const;
它的实现也非常简单,就是对结构体中的变量逐个地赋值:
void FrameStamp::setCalendarTime(const tm& ct)
{
tm_sec = ct.tm_sec; /* Seconds. [0-60] (1 leap second) */
tm_min = ct.tm_min; /* Minutes. [0-59] */
tm_hour = ct.tm_hour; /* Hours. [0-23] */
tm_mday = ct.tm_mday; /* Day. [1-31] */
tm_mon = ct.tm_mon; /* Month. [0-11] */
tm_year = ct.tm_year; /* Year - 1900. */
tm_wday = ct.tm_wday; /* Day of week. [0-6] */
tm_yday = ct.tm_yday; /* Days in year.[0-365] */
tm_isdst = ct.tm_isdst; /* DST. [-1/0/1]*/
}
void FrameStamp::getCalendarTime(tm& ct) const
{
ct.tm_sec = tm_sec; /* Seconds. [0-60] (1 leap second) */
ct.tm_min = tm_min; /* Minutes. [0-59] */
ct.tm_hour = tm_hour; /* Hours. [0-23] */
ct.tm_mday = tm_mday; /* Day. [1-31] */
ct.tm_mon = tm_mon; /* Month. [0-11] */
ct.tm_year = tm_year; /* Year - 1900. */
ct.tm_wday = tm_wday; /* Day of week. [0-6] */
ct.tm_yday = tm_yday; /* Days in year.[0-365] */
ct.tm_isdst = tm_isdst; /* DST. [-1/0/1]*/
}
除此之外就只剩下构造函数,复制构造函数,析构函数,赋值操作符:这些函数的实现主要就是对这四个成员变量的一些赋值而已,只需要记住,这些成员变量默认值都是0。
FrameStamp();//构造函数
FrameStamp(const FrameStamp& fs);//复制构造函数
FrameStamp& operator = (const FrameStamp& fs);//赋值操作符
virtual ~FrameStamp();//析构函数
单独看这个类其实感觉不到它可以用来干什么,这个类只有结合OSG中的其他类才可以看到它的用途,特别是View,Viewer等这些类。
最后看一下