OSG中与时间相关的类osg::FrameStamp,osg::Timer源码剖析

本文详细探讨了OSG中的osg::FrameStamp和osg::Timer类,包括它们的成员变量、方法以及在osg::View和osgViewer::Viewer中的应用。osg::FrameStamp用于表示帧时间戳,而osg::Timer提供高精度计时功能。在osgViewer::Viewer的advance函数中,osg::Timer被用来计算时间间隔,确保了高效的渲染流程。
摘要由CSDN通过智能技术生成

这次分析一下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等这些类。

最后看一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值