fix: threads don't idle while inactive

This commit is contained in:
Sara Gerretsen 2026-03-03 16:44:58 +01:00
parent a214291c2f
commit 0f5539ebc0
3 changed files with 58 additions and 15 deletions

View file

@ -31,8 +31,26 @@ void Terrain::update_meshes() {
this->dirty_meshes_lock.unlock();
mesh->apply_new_mesh();
}
if (this->dirty_meshes.is_empty()) {
set_process(false);
}
void Terrain::update_threads() {
this->workload_lock.lock();
if (this->workload.is_empty()) {
this->threads_stop = true;
this->workload_lock.unlock();
for (Thread &thread : this->threads) {
if (thread.is_started()) {
thread.wait_to_finish();
}
}
} else {
this->threads_stop = false;
for (Thread &thread : this->threads) {
if (!thread.is_started()) {
thread.start(Terrain::generate_meshes_thread, this);
}
}
this->workload_lock.unlock();
}
}
@ -50,6 +68,7 @@ void Terrain::_notification(int what) {
return;
case NOTIFICATION_PROCESS:
update_meshes();
update_threads();
return;
case NOTIFICATION_EXIT_TREE:
this->workload_lock.lock();

View file

@ -13,6 +13,7 @@ class Terrain : public Node {
static void _bind_methods();
void child_order_changed();
void update_meshes();
void update_threads();
protected:
void _notification(int what);

View file

@ -17,6 +17,11 @@ _limits = [0.0, 1.0, 0.0, 300.0]
_data = [Vector2(0, 1), 0.0, -0.00018586064, 0, 0, Vector2(300, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="Curve" id="Curve_o3i6r"]
_limits = [0.0, 1.0, 0.0, 100.0]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(52.483585, 0.53811765), -0.024930112, -0.024930112, 0, 0, Vector2(71.53754, 0.12219274), -0.012579738, -0.012579738, 0, 0, Vector2(100, 0), 0.0, 0.0, 0, 0]
point_count = 4
[sub_resource type="Curve" id="Curve_kbmr5"]
_limits = [0.0, 1.0, 0.0, 300.0]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(69.40413, 0.8155421), -0.008522048, -0.008522048, 0, 0, Vector2(124.08008, 0.34781557), -0.0070376517, -0.0070376517, 0, 0, Vector2(244.43303, 0), 0.00011380972, 0.0, 0, 0]
@ -35,29 +40,47 @@ chunk_size = 100
thread_count = 5
[node name="TerrainModifierPath2" type="TerrainModifierPath" parent="Terrain" unique_id=645020759]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 251.12363, 255.25969, 182.0507)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 251.12363, 255.25969, 248.8021)
gizmo_extents = 100.0
curve_left = SubResource("Curve_w3uoq")
[node name="TerrainModifierPathPoint" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath2" unique_id=59754729]
gizmo_extents = 50.0
[node name="TerrainModifierPathPoint5" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath2" unique_id=460239910]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 101.51407, -59.121643, -89.72089)
gizmo_extents = 50.0
[node name="TerrainModifierPathPoint2" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath2" unique_id=94753507]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 274.68933, -82.27042, -75.669815)
gizmo_extents = 50.0
[node name="TerrainModifierPathPoint4" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath2" unique_id=473450276]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 437.1725, -161.30762, -75.669815)
gizmo_extents = 50.0
[node name="TerrainModifierPathPoint3" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath2" unique_id=1474399635]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 595.01825, -141.92302, 42.69197)
gizmo_extents = 50.0
[node name="TerrainModifierPath4" type="TerrainModifierPath" parent="Terrain" unique_id=1865212969]
transform = Transform3D(0.17220415, 0, -0.9850613, 0, 1, 0, 0.9850613, 0, 0.17220415, 847.4274, 114.188705, 296.454)
gizmo_extents = 100.0
curve_left = SubResource("Curve_w3uoq")
[node name="TerrainModifierPathPoint" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath4" unique_id=1307746348]
gizmo_extents = 50.0
[node name="TerrainModifierPathPoint3" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath4" unique_id=331993744]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 595.01825, -12.977875, 42.69197)
gizmo_extents = 50.0
[node name="TerrainModifierPath3" type="TerrainModifierPath" parent="Terrain" unique_id=1721431246]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 482.5311, 36.249924, 85.91423)
curve_left = SubResource("Curve_o3i6r")
[node name="TerrainModifierPathPoint" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath3" unique_id=1744128498]
[node name="TerrainModifierPathPoint2" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath3" unique_id=560389606]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 116.74786)
[node name="TerrainModifierPathPoint4" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath3" unique_id=221640403]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -32.71512, 229.67038)
[node name="TerrainModifierPathPoint5" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath3" unique_id=2015729881]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -77.74802, 319.90332)
[node name="TerrainModifierPathPoint3" type="TerrainModifierPathPoint" parent="Terrain/TerrainModifierPath3" unique_id=2010545766]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -120.10968, 381.31598)
[node name="TerrainModifierPath" type="TerrainModifierPath" parent="Terrain" unique_id=314094590]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1033.4109, 14.052078, 504.81018)
gizmo_extents = 100.0