Переглянути джерело

`LODManager` - Auto-deactivate when no LODs

lawnjelly 2 місяців тому
батько
коміт
98567a0375
2 змінених файлів з 11 додано та 2 видалено
  1. 8 2
      scene/3d/lod_manager.cpp
  2. 3 0
      scene/3d/lod_manager.h

+ 8 - 2
scene/3d/lod_manager.cpp

@@ -47,11 +47,17 @@ void LODManager::remove_camera(Camera *p_camera) {
 void LODManager::register_lod(LOD *p_lod, uint32_t p_queue_id) {
 	ERR_FAIL_UNSIGNED_INDEX(p_queue_id, NUM_LOD_QUEUES);
 	data.queues[p_queue_id].lods.push_back(p_lod);
+	data.total_lods++;
 }
 
 void LODManager::unregister_lod(LOD *p_lod, uint32_t p_queue_id) {
 	ERR_FAIL_UNSIGNED_INDEX(p_queue_id, NUM_LOD_QUEUES);
-	data.queues[p_queue_id].lods.erase(p_lod);
+	if (data.queues[p_queue_id].lods.erase_unordered(p_lod)) {
+		data.total_lods--;
+		DEV_CHECK_ONCE(data.total_lods >= 0);
+	} else {
+		ERR_FAIL();
+	}
 }
 
 void LODManager::_update_queue(uint32_t p_queue_id, const Vector3 *p_camera_positions, uint32_t p_num_cameras) {
@@ -145,7 +151,7 @@ void LODManager::notify_saving(bool p_active) {
 }
 
 void LODManager::update() {
-	if (!_enabled) {
+	if (!_enabled || !data.total_lods) {
 		return;
 	}
 

+ 3 - 0
scene/3d/lod_manager.h

@@ -66,6 +66,9 @@ private:
 		Queue queues[NUM_LOD_QUEUES];
 		BinaryMutex mutex;
 		bool saving = false;
+
+		// Used to disable LODManager updates when there are no LODs in use (reduces CPU utilization).
+		int32_t total_lods = 0;
 	} data;
 
 	static bool _enabled;