自定义游戏服务端时间C++ 11实现

发布时间 2023-08-24 10:16:12作者: 悉野

 

TimeSystem.h

#pragma once
#include <stdint.h>

class TimeSystem
{
public:
    TimeSystem();

    // 上一帧刷新时间增量 毫秒
    int64_t DeltaTime;

    //当前时间戳(毫秒)
    int64_t NowServerMilliseconds();
    //当前时间戳(秒)
    int64_t NowServerSeconds();

    //系统当前时间戳(毫秒)
    int64_t SysNowServerMilliseconds();
    //系统当前时间戳(秒)
    int64_t SysNowServerSeconds();

    //当前一天的0分0秒时间戳(秒)
    int32_t DayZero();

    //自定义当前时间
    void SetUserTime(int32_t now);
private:
    // 刷新更新时间
    void RefreshLastTime();
    // 操作系统已运行时间(毫秒)
    int64_t OperatingSystemRunTime();
private:
    // 上次更新时间
    int64_t    m_last_time;

    //用户增加的毫秒数
    int64_t m_user_add_time;

    friend class GameSystem;
};
TimeSystem.cpp
#include "TimeSystem.h"
#include <chrono>

TimeSystem::TimeSystem()
{
    //操作系统已运行时间(毫秒)
    m_last_time = OperatingSystemRunTime();
    //用户增加的毫秒数
    m_user_add_time = SysNowServerMilliseconds() - OperatingSystemRunTime();

    DeltaTime = 0;
}

int64_t TimeSystem::NowServerMilliseconds()
{
    //当前时间 = 用户时间 + 操作系统运行的时间
    return m_user_add_time + OperatingSystemRunTime();
}

int64_t TimeSystem::NowServerSeconds()
{
    return NowServerMilliseconds() / 1000;
}

int64_t TimeSystem::SysNowServerMilliseconds()
{
    return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}

int64_t TimeSystem::SysNowServerSeconds()
{
    return SysNowServerMilliseconds() / 1000;
}

int32_t TimeSystem::DayZero()
{
    time_t now_second = NowServerSeconds();
    //24*3600=86400
    int32_t sec = now_second % 86400;
    return now_second - sec;
}

// 刷新更新时间
void TimeSystem::RefreshLastTime()
{
    int64_t now_time = OperatingSystemRunTime();
    DeltaTime = now_time - m_last_time;
    if (DeltaTime < 0)
    {
        //时间回调, DeltaTime可能为负了
        DeltaTime = 0;
    }
    m_last_time = now_time;
}

//操作系统已运行时间(修改电脑时钟不会影响操作系统已运行时间)
int64_t TimeSystem::OperatingSystemRunTime()
{
    return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
}

//设置自定义时间
void TimeSystem::SetUserTime(int32_t now)
{
    if (now == 0)
    {
        //还原使用系统时间
        m_user_add_time = SysNowServerMilliseconds() - OperatingSystemRunTime();
    }
    else
    {
        m_user_add_time = now;
        m_user_add_time *= 1000;
        int64_t relative = OperatingSystemRunTime();
        m_user_add_time -= relative;
    }
}