This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/wwnet/netstats.cpp

177 lines
4.5 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//
// Filename: netstats.cpp
// Project: wwnet
// Author: Tom Spencer-Smith
// Date: Oct 1998
// Description:
//
//------------------------------------------------------------------------------------
#include "netstats.h" // I WANNA BE FIRST!
#include "win.h"
#include "systimer.h"
#include "miscutil.h"
#include "netutil.h"
#include "wwdebug.h"
//
// class defines
//
//------------------------------------------------------------------------------------
cNetStats::cNetStats() :
LastUnreliablePacketId(-1),
FreezePacketId(-1)
{
Init_Net_Stats();
}
//------------------------------------------------------------------------------------
void cNetStats::Init_Net_Stats()
{
StartTime = TIMEGETTIME();
SampleStartTime = StartTime;
for (int statistic = 0; statistic < STAT_COUNT; statistic++) {
StatTotal[statistic] = 0;
StatAverage[statistic] = 0;
StatSnapshot[statistic] = 0;
StatMacroSnapshot[statistic] = 0;
StatSample[statistic] = 0;
StatMacroSample[statistic] = 0;
}
RemotePacketloss = 0;
UnreliableCount = 0;
FreezePacketId = LastUnreliablePacketId;
RemoteServiceCount = 0;
}
//------------------------------------------------------------------------------------
double cNetStats::Get_Pc_Packetloss_Received() const
{
double packetloss_pc = 0;
int packet_count = LastUnreliablePacketId - FreezePacketId;
WWASSERT(packet_count >= 0);
if (packet_count > 0) {
//
// Must add 1 to PrevLastUnreliable because packet id starts at 0
//
packetloss_pc = 100 * (1 - UnreliableCount / (double) packet_count);
}
return packetloss_pc;
}
//------------------------------------------------------------------------------------
void cNetStats::Set_Pc_Packetloss_Sent(double packetloss_pc)
{
/*TSS102901
WWASSERT(packetloss_pc > -MISCUTIL_EPSILON && packetloss_pc < 100 + MISCUTIL_EPSILON);
RemotePacketloss = packetloss_pc;
*/
}
//------------------------------------------------------------------------------------
void cNetStats::Set_Remote_Service_Count(int remote_service_count)
{
//WWASSERT(remote_service_count >= 0);
RemoteServiceCount = remote_service_count;
}
//------------------------------------------------------------------------------------
bool cNetStats::Update_If_Sample_Done(int this_frame_time, bool force_update)
{
bool is_updated = false;
static int update_count = 0;
if (force_update || this_frame_time - SampleStartTime > cNetUtil::NETSTATS_SAMPLE_TIME_MS) {
update_count++;
double total_time = (this_frame_time - StartTime) / 1000.0;
if (total_time < MISCUTIL_EPSILON) {
total_time = MISCUTIL_EPSILON;
}
for (int statistic = 0; statistic < STAT_COUNT; statistic++) {
StatTotal[statistic] += StatSample[statistic];
StatAverage[statistic] = (UINT) (StatTotal[statistic] / total_time);
StatSnapshot[statistic] = StatSample[statistic];
StatMacroSample[statistic] += StatSample[statistic];
StatSample[statistic] = 0;
if (update_count % 4 == 0) {
StatMacroSnapshot[statistic] = StatMacroSample[statistic];
StatMacroSample[statistic] = 0;
}
}
SampleStartTime = this_frame_time;
is_updated = true;
}
return is_updated;
}
//const USHORT cNetStats::SAMPLE_TIME = 500;
// crash here when exit server thread before client
//WWASSERT(packetloss_pc >= 0 && packetloss_pc <= 100);
/*
//
// These 2 stats are computed from others
//
if (StatSample[STAT_AppByteSent] > 0) {
StatSample[STAT_AppDataSentPc] = (UINT) (100 * StatSample[STAT_AppByteSent] /
(double) (StatSample[STAT_AppByteSent] + StatSample[STAT_HdrByteSent]));
}
if (StatSample[STAT_AppByteRcv] > 0) {
StatSample[STAT_AppDataRcvPc] = (UINT) (100 * StatSample[STAT_AppByteRcv] /
(double) (StatSample[STAT_AppByteRcv] + StatSample[STAT_HdrByteRcv]));
}
*/