summaryrefslogtreecommitdiff
path: root/engine/enginestats.h
blob: f3e29fe004c88ead71e5d66dc0310c6c1ebf6911 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef ENGINESTATS_H
#define ENGINESTATS_H

#ifdef _WIN32
#pragma once
#endif

#include "utlvector.h"
#include "sysexternal.h"
#include "filesystem.h" // FileHandle_t define

enum EngineTimedStatId_t
{
	ENGINE_STATS_FRAME_TIME,
	ENGINE_STATS_FPS, // this is calculated at EndFrame!
	ENGINE_STATS_FPS_VARIABILITY,
	ENGINE_STATS_NUM_TIMED_STATS,
};
class CEngineStats
{
public:
	CEngineStats();

	//
	// stats input
	//

	void BeginRun( void );

	// Advances the next frame for the stats...
	void NextFrame(); 

	void BeginFrame( void );

	// Timed stat gathering
	void BeginTimedStat( EngineTimedStatId_t stat );
	void EndTimedStat( EngineTimedStatId_t stat );

	// Adds to a timed stat...
	void AddToTimedStat( EngineTimedStatId_t stat, float time );

	// Slams a timed stat
	void SetTimedStat( EngineTimedStatId_t stat, float time );

	// returns timed stats
	double TimedStatInFrame( EngineTimedStatId_t stat ) const;
	double TotalTimedStat( EngineTimedStatId_t stat ) const;

	void BeginDrawWorld( void );
	void EndDrawWorld( void );

	void EndFrame( void );
	void EndRun( void );

	void PauseStats( bool bPaused );

	//
	// stats output
	// call these outside of a BeginFrame/EndFrame pair
	//

	double GetRunTime( void );
	
	void SetFrameTime( float flFrameTime ) { m_flFrameTime = flFrameTime; }
	void SetFPSVariability( float flFPSVariability ) { m_flFPSVariability = flFPSVariability; }

	int FrameCount() const { return m_totalNumFrames; }

private:
	void ComputeFrameTimeStats( void );

	// How many frames worth of data have we logged?
	int m_totalNumFrames;

	// run timing data
	double m_runStartTime;
	double m_runEndTime;

	struct StatGroupInfo_t
	{
		double m_StatFrameTime[ENGINE_STATS_NUM_TIMED_STATS];
		double m_StatStartTime[ENGINE_STATS_NUM_TIMED_STATS];
		double m_TotalStatTime[ENGINE_STATS_NUM_TIMED_STATS];
	};
	StatGroupInfo_t m_StatGroup;
	bool m_InFrame;

	bool m_bPaused;
	bool m_bInRun;

	float m_flFrameTime;
	float m_flFPSVariability;
};


//-----------------------------------------------------------------------------
// Inlined stat gathering methods
//-----------------------------------------------------------------------------
inline void CEngineStats::BeginTimedStat( EngineTimedStatId_t stat )
{
	if (m_InFrame)
	{
		m_StatGroup.m_StatStartTime[stat] = 
			Sys_FloatTime();
	}
}

inline void CEngineStats::EndTimedStat( EngineTimedStatId_t stat )
{
	if (m_InFrame)
	{
		float dt = (float)Sys_FloatTime() - (float)(m_StatGroup.m_StatStartTime[stat]);
		m_StatGroup.m_StatFrameTime[stat] += dt; 
	}
}

// Adds to a timed stat...
inline void CEngineStats::AddToTimedStat( EngineTimedStatId_t stat, float dt )
{
	if (m_InFrame)
	{
		m_StatGroup.m_StatFrameTime[stat] += dt; 
	}
}

// Slams a timed stat
inline void CEngineStats::SetTimedStat( EngineTimedStatId_t stat, float time )
{
	m_StatGroup.m_StatFrameTime[stat] = time; 
}
extern CEngineStats g_EngineStats;

#endif // ENGINESTATS_H