Browse Source

defer transmitting until frame has begin properly

David Rose 17 years ago
parent
commit
c85f5e39f5

+ 12 - 4
panda/src/pstatclient/pStatClientImpl.cxx

@@ -184,6 +184,8 @@ new_frame(int thread_index) {
   }
 
   float frame_start = get_real_time();
+  int frame_number = -1;
+  PStatFrameData frame_data;
 
   if (!pthread->_frame_data.is_empty()) {
     // Collector 0 is the whole frame.
@@ -201,7 +203,8 @@ new_frame(int thread_index) {
         pthread->_frame_data.add_level(i, ptd._level);
       }
     }
-    transmit_frame_data(thread_index);
+    pthread->_frame_data.swap(frame_data);
+    frame_number = pthread->_frame_number;
   }
 
   pthread->_frame_data.clear();
@@ -211,6 +214,10 @@ new_frame(int thread_index) {
   // Also record the time for the PStats operation itself.
   int pstats_index = PStatClient::_pstats_pcollector.get_index();
   _client->start(pstats_index, thread_index, frame_start);
+
+  if (frame_number != -1) {
+    transmit_frame_data(thread_index, frame_number, frame_data);
+  }
   _client->stop(pstats_index, thread_index, get_real_time());
 }
 
@@ -221,7 +228,8 @@ new_frame(int thread_index) {
 //               transmit the latest data to the PStatServer.
 ////////////////////////////////////////////////////////////////////
 void PStatClientImpl::
-transmit_frame_data(int thread_index) {
+transmit_frame_data(int thread_index, int frame_number, 
+                    const PStatFrameData &frame_data) {
   nassertv(thread_index >= 0 && thread_index < _client->_num_threads);
   PStatClient::InternalThread *thread = _client->get_thread_ptr(thread_index);
   if (_is_connected && thread->_is_active) {
@@ -243,11 +251,11 @@ transmit_frame_data(int thread_index) {
       datagram.add_uint8(0);
 
       datagram.add_uint16(thread_index);
-      datagram.add_uint32(thread->_frame_number);
+      datagram.add_uint32(frame_number);
 
       bool sent;
 
-      if (!thread->_frame_data.write_datagram(datagram, _client)) {
+      if (!frame_data.write_datagram(datagram, _client)) {
         // Too many events to fit in a single datagram.  Maybe it was
         // a long frame load or something.  Just drop the datagram.
         sent = false;

+ 2 - 1
panda/src/pstatclient/pStatClientImpl.h

@@ -74,7 +74,8 @@ public:
   void new_frame(int thread_index);
 
 private:
-  void transmit_frame_data(int thread_index);
+  void transmit_frame_data(int thread_index, int frame_number,
+                           const PStatFrameData &frame_data);
 
   void transmit_control_data();
 

+ 12 - 0
panda/src/pstatclient/pStatFrameData.I

@@ -58,6 +58,18 @@ clear() {
   _level_data.clear();
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: PStatFrameData::swap
+//       Access: Public
+//  Description: Exchanges the data in this object with the data in
+//               the other.
+////////////////////////////////////////////////////////////////////
+INLINE void PStatFrameData::
+swap(PStatFrameData &other) {
+  _time_data.swap(other._time_data);
+  _level_data.swap(other._level_data);
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: PStatFrameData::add_start
 //       Access: Public

+ 1 - 0
panda/src/pstatclient/pStatFrameData.h

@@ -39,6 +39,7 @@ public:
   INLINE bool is_level_empty() const;
   INLINE bool is_empty() const;
   INLINE void clear();
+  INLINE void swap(PStatFrameData &other);
 
   INLINE void add_start(int index, float time);
   INLINE void add_stop(int index, float time);