28 _client_data(client_data)
30 _first_frame_number = 0;
31 _history = pstats_history;
32 _computed_elapsed_frames =
false;
48 return _frames.empty();
56 nassertr(!_frames.empty(), 0);
57 return _first_frame_number + _frames.size() - 1;
65 nassertr(!_frames.empty(), 0);
66 return _first_frame_number;
75 int rel_frame = frame_number - _first_frame_number;
77 return (rel_frame >= 0 && rel_frame < (
int)_frames.size() &&
78 _frames[rel_frame] !=
nullptr);
88 int rel_frame = frame_number - _first_frame_number;
89 int num_frames = _frames.size();
90 if (rel_frame >= num_frames) {
91 rel_frame = num_frames - 1;
94 while (rel_frame >= 0 && _frames[rel_frame] ==
nullptr) {
100 while (rel_frame < num_frames &&
101 _frames[rel_frame] ==
nullptr) {
106 if (rel_frame >= 0 && rel_frame < num_frames) {
108 nassertr(frame !=
nullptr, _null_frame);
109 nassertr(frame->
get_start() >= 0.0, _null_frame);
113 nassertr(_null_frame.
get_start() >= 0.0, _null_frame);
123 nassertr(!_frames.empty(), 0.0);
124 return _frames.back()->get_start();
133 nassertr(!_frames.empty(), 0.0);
134 return _frames.front()->get_start();
155 hint -= _first_frame_number;
156 if (hint >= 0 && hint < (
int)_frames.size()) {
157 if (_frames[hint] !=
nullptr &&
158 _frames[hint]->get_start() <= time) {
161 while (i < (
int)_frames.size() &&
162 (_frames[i] ==
nullptr ||
163 _frames[i]->get_start() <= time)) {
164 if (_frames[i] !=
nullptr) {
169 return _first_frame_number + hint;
175 int i = _frames.size() - 1;
178 if (frame !=
nullptr && frame->
get_start() <= time) {
184 return _first_frame_number + i;
192 nassertr(!_frames.empty(), _null_frame);
193 return *_frames.back();
204 if (!_computed_elapsed_frames) {
210 return _got_elapsed_frames;
224 int num_frames = now_i - then_i + 1;
225 double now = _frames[now_i - _first_frame_number]->get_end();
226 double elapsed_time = (now - _frames[then_i - _first_frame_number]->get_start());
227 return (
double)num_frames / elapsed_time;
262 nassertv(frame_data !=
nullptr);
267 double oldest_allowable_time = time - _history;
268 while (!_frames.empty() &&
269 (_frames.front() ==
nullptr ||
270 _frames.front()->is_empty() ||
271 _frames.front()->get_start() < oldest_allowable_time)) {
272 if (_frames.front() !=
nullptr) {
273 delete _frames.front();
276 _first_frame_number++;
282 if (_frames.empty()) {
283 _first_frame_number = frame_number;
284 _frames.push_back(
nullptr);
287 while (_first_frame_number + (
int)_frames.size() <= frame_number) {
288 _frames.push_back(
nullptr);
292 int index = frame_number - _first_frame_number;
293 nassertv(index >= 0 && index < (
int)_frames.size());
295 if (_frames[index] !=
nullptr) {
296 nout <<
"Got repeated frame data for frame " << frame_number <<
"\n";
297 delete _frames[index];
300 _frames[index] = frame_data;
301 _computed_elapsed_frames =
false;
309 void PStatThreadData::
310 compute_elapsed_frames() {
311 if (_frames.empty()) {
313 _got_elapsed_frames =
false;
316 _now_i = _frames.size() - 1;
317 while (_now_i > 0 && _frames[_now_i] ==
nullptr) {
322 _got_elapsed_frames =
false;
325 nassertv(_frames[_now_i] !=
nullptr);
327 double now = _frames[_now_i]->get_end();
328 double then = now - pstats_average_time;
335 if (frame !=
nullptr) {
345 nassertv(_then_i >= 0);
346 nassertv(_frames[_then_i] !=
nullptr);
347 _got_elapsed_frames =
true;
349 _now_i += _first_frame_number;
350 _then_i += _first_frame_number;
354 _computed_elapsed_frames =
true;