Browse Source

Fix frame chug when loading big model asynchronously (LP #1019599)

rdb 9 years ago
parent
commit
7b7bf93118
2 changed files with 13 additions and 1 deletions
  1. 1 0
      doc/ReleaseNotes
  2. 12 1
      panda/src/putil/bamCache.cxx

+ 1 - 0
doc/ReleaseNotes

@@ -25,6 +25,7 @@ This issue fixes several bugs that were still found in 1.9.2.
 * Work around Cg bug generating invalid ASM for saturated tex loads
 * Work around Cg bug generating invalid ASM for saturated tex loads
 * Fix issues with certain Cg shader inputs in DX9
 * Fix issues with certain Cg shader inputs in DX9
 * Support uint8 index buffers in DX9
 * Support uint8 index buffers in DX9
+* Fix occasional frame lag when loading a big model asynchronously
 
 
 ------------------------  RELEASE 1.9.2  ------------------------
 ------------------------  RELEASE 1.9.2  ------------------------
 
 

+ 12 - 1
panda/src/putil/bamCache.cxx

@@ -321,13 +321,24 @@ emergency_read_only() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void BamCache::
 void BamCache::
 consider_flush_index() {
 consider_flush_index() {
-  ReMutexHolder holder(_lock);
+#if defined(HAVE_THREADS) || defined(DEBUG_THREADS)
+  if (!_lock.try_acquire()) {
+    // If we can't grab the lock, no big deal.  We don't want to hold up
+    // the frame waiting for a cache operation.  We can try again later.
+    return;
+  }
+#endif
+
   if (_index_stale_since != 0) {
   if (_index_stale_since != 0) {
     int elapsed = (int)time(NULL) - (int)_index_stale_since;
     int elapsed = (int)time(NULL) - (int)_index_stale_since;
     if (elapsed > _flush_time) {
     if (elapsed > _flush_time) {
       flush_index();
       flush_index();
     }
     }
   }
   }
+
+#if defined(HAVE_THREADS) || defined(DEBUG_THREADS)
+  _lock.release();
+#endif
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////