NLA SoC: Merge from 2.5 - 21179 to 21209
[blender.git] / source / gameengine / Ketsji / KX_TimeLogger.cpp
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #include "KX_TimeLogger.h"
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 KX_TimeLogger::KX_TimeLogger(unsigned int maxNumMeasurements) : 
37         m_maxNumMeasurements(maxNumMeasurements), 
38         m_logStart(0),
39         m_logging(false)
40 {
41 }
42
43
44 KX_TimeLogger::~KX_TimeLogger(void)
45 {
46 }
47
48
49 void KX_TimeLogger::SetMaxNumMeasurements(unsigned int maxNumMeasurements)
50 {
51         if ((m_maxNumMeasurements != maxNumMeasurements) && maxNumMeasurements) {
52                 // Actual removing is done in NextMeasurement()
53                 m_maxNumMeasurements = maxNumMeasurements;
54         }
55 }
56
57
58 unsigned int KX_TimeLogger::GetMaxNumMeasurements(void) const
59 {
60         return m_maxNumMeasurements;
61 }
62
63
64 void KX_TimeLogger::StartLog(double now)
65 {
66         if (!m_logging) {
67                 m_logging = true;
68                 m_logStart = now;
69         }
70 }
71
72
73 void KX_TimeLogger::EndLog(double now)
74 {
75         if (m_logging) {
76                 m_logging = false;
77                 double time = now - m_logStart;
78                 if (m_measurements.size() > 0) {
79                         m_measurements[0] += time;
80                 }
81         }
82 }
83
84
85 void KX_TimeLogger::NextMeasurement(double now)
86 {
87         // End logging to current measurement
88         EndLog(now);
89
90         // Add a new measurement at the front
91         double m = 0.;
92         m_measurements.push_front(m);
93
94         // Remove measurement if we grow beyond the maximum size
95         if ((m_measurements.size()) > m_maxNumMeasurements) {
96                 while (m_measurements.size() > m_maxNumMeasurements) {
97                         m_measurements.pop_back();
98                 }
99         }
100 }
101
102
103
104 double KX_TimeLogger::GetAverage(void) const
105 {
106         double avg = 0.;
107
108         unsigned int numMeasurements = m_measurements.size();
109         if (numMeasurements > 1) {
110                 for (unsigned int i = 1; i < numMeasurements; i++) {
111                         avg += m_measurements[i];
112                 }
113                 avg /= (float)numMeasurements - 1;
114         }
115
116         return avg;
117 }
118