mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
ClockObject::calc_frame_rate_deviation()
This commit is contained in:
parent
9dd0e3b685
commit
181f690bb8
@ -181,14 +181,15 @@ do_update(Thread *current_thread) {
|
|||||||
_last_update = _clock_object->get_frame_time(current_thread);
|
_last_update = _clock_object->get_frame_time(current_thread);
|
||||||
|
|
||||||
double frame_rate = _clock_object->get_average_frame_rate(current_thread);
|
double frame_rate = _clock_object->get_average_frame_rate(current_thread);
|
||||||
|
double deviation = _clock_object->calc_frame_rate_deviation(current_thread);
|
||||||
|
|
||||||
static const size_t buffer_size = 1024;
|
static const size_t buffer_size = 1024;
|
||||||
char buffer[buffer_size];
|
char buffer[buffer_size];
|
||||||
#ifdef WIN32_VC
|
#ifdef WIN32_VC
|
||||||
// Windows doesn't define snprintf(). Hope we don't overflow.
|
// Windows doesn't define snprintf(). Hope we don't overflow.
|
||||||
sprintf(buffer, _text_pattern.c_str(), frame_rate);
|
sprintf(buffer, _text_pattern.c_str(), frame_rate, deviation);
|
||||||
#else
|
#else
|
||||||
snprintf(buffer, buffer_size, _text_pattern.c_str(), frame_rate);
|
snprintf(buffer, buffer_size, _text_pattern.c_str(), frame_rate, deviation);
|
||||||
#endif
|
#endif
|
||||||
nassertv(strlen(buffer) < buffer_size);
|
nassertv(strlen(buffer) < buffer_size);
|
||||||
|
|
||||||
|
@ -277,6 +277,41 @@ get_average_frame_rate(Thread *current_thread) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: ClockObject::calc_frame_time_deviation
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the standard deviation of the frame times of
|
||||||
|
// the frames rendered over the past
|
||||||
|
// get_average_frame_rate_interval() seconds. This
|
||||||
|
// number gives an estimate of the chugginess of the
|
||||||
|
// frame rate; if it is large, there is a large
|
||||||
|
// variation in the frame rate; if is small, all of the
|
||||||
|
// frames are consistent in length.
|
||||||
|
//
|
||||||
|
// A large value might also represent just a recent
|
||||||
|
// change in frame rate, for instance, because the
|
||||||
|
// camera has just rotated from looking at a simple
|
||||||
|
// scene to looking at a more complex scene.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
double ClockObject::
|
||||||
|
calc_frame_rate_deviation(Thread *current_thread) const {
|
||||||
|
CDStageReader cdata(_cycler, 0, current_thread);
|
||||||
|
if (_ticks.size() <= 1) {
|
||||||
|
return 0.0;
|
||||||
|
} else {
|
||||||
|
double mean = (_ticks.back() - _ticks.front()) / (_ticks.size() - 1);
|
||||||
|
size_t i;
|
||||||
|
double sum_squares = 0.0;
|
||||||
|
for (i = 0; i < _ticks.size() - 1; ++i) {
|
||||||
|
double delta = _ticks[i + 1] - _ticks[i];
|
||||||
|
double diff = (delta - mean);
|
||||||
|
sum_squares += (diff * diff);
|
||||||
|
}
|
||||||
|
double deviation_2 = sum_squares / (_ticks.size() - 1);
|
||||||
|
return sqrt(deviation_2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: ClockObject::tick
|
// Function: ClockObject::tick
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -108,6 +108,7 @@ PUBLISHED:
|
|||||||
INLINE void set_average_frame_rate_interval(double time);
|
INLINE void set_average_frame_rate_interval(double time);
|
||||||
INLINE double get_average_frame_rate_interval() const;
|
INLINE double get_average_frame_rate_interval() const;
|
||||||
double get_average_frame_rate(Thread *current_thread = Thread::get_current_thread()) const;
|
double get_average_frame_rate(Thread *current_thread = Thread::get_current_thread()) const;
|
||||||
|
double calc_frame_rate_deviation(Thread *current_thread = Thread::get_current_thread()) const;
|
||||||
|
|
||||||
void tick(Thread *current_thread = Thread::get_current_thread());
|
void tick(Thread *current_thread = Thread::get_current_thread());
|
||||||
void sync_frame_time(Thread *current_thread = Thread::get_current_thread());
|
void sync_frame_time(Thread *current_thread = Thread::get_current_thread());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user