feat: performance budget profiling setup

- docs/performance-budget.md: 60fps/2GB VRAM budget with CPU, GPU,
  memory, and draw-call targets (P95<16.6ms, P99<50ms)
- scripts/profiling/: SceneTree + Node profilers, test scenes
- scripts/generate_occluders.gd: auto-generate OccluderInstance3D
  from CSG wall pieces (128^3 voxel occlusion culling)
- scripts/convert_csg_to_mesh.gd: CSG->StaticMesh baker with LOD
  slots (LOD1@15m, LOD2@30m)
- project.godot: occlusion culling + LOD settings enabled
- modular scene UV2 data from lightmapping pass
- rcon_command_handler.gd conflict resolved (kept upstream plugin cmd)
- Fixed profiler_node.gd warmup frame bug (60 frames, not 3)
- Fixed convert_csg_to_mesh.gd LOD API (add_lod + distance)
This commit is contained in:
2026-07-01 19:01:03 -04:00
parent 34507f9043
commit e385eae0f5
23 changed files with 1114 additions and 22 deletions
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/accent_team_blue.tres" id="1"]
[node name="BluePanel01" type="CSGBox3D" parent="."]
[node name="BluePanel01" type="CSGBox3D"]
size = Vector3(1.28, 0.64, 0.08)
material = ExtResource("1")
use_collision = true
visibility_range_end = 20.0
visibility_range_end_margin = 2.0
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/accent_team_red.tres" id="1"]
[node name="RedPanel01" type="CSGBox3D" parent="."]
[node name="RedPanel01" type="CSGBox3D"]
size = Vector3(1.28, 0.64, 0.08)
material = ExtResource("1")
use_collision = true
visibility_range_end = 20.0
visibility_range_end_margin = 2.0
+3 -1
View File
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/metal_structural_01.tres" id="1"]
[node name="Beam01" type="CSGBox3D" parent="."]
[node name="Beam01" type="CSGBox3D"]
size = Vector3(3.84, 0.32, 0.32)
material = ExtResource("1")
use_collision = true
visibility_range_end = 30.0
visibility_range_end_margin = 3.0
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/floor_concrete_01.tres" id="1"]
[node name="FloorTile01" type="CSGBox3D" parent="."]
[node name="FloorTile01" type="CSGBox3D"]
size = Vector3(2.56, 0.08, 2.56)
material = ExtResource("1")
use_collision = true
visibility_range_end = 60.0
visibility_range_end_margin = 10.0
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/floor_tile_01.tres" id="1"]
[node name="FloorTileCeramic01" type="CSGBox3D" parent="."]
[node name="FloorTileCeramic01" type="CSGBox3D"]
size = Vector3(2.56, 0.08, 2.56)
material = ExtResource("1")
use_collision = true
visibility_range_end = 60.0
visibility_range_end_margin = 10.0
+3 -1
View File
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_02.tres" id="1"]
[node name="Pillar01" type="CSGBox3D" parent="."]
[node name="Pillar01" type="CSGBox3D"]
size = Vector3(0.64, 2.56, 0.64)
material = ExtResource("1")
use_collision = true
visibility_range_end = 30.0
visibility_range_end_margin = 3.0
@@ -1,8 +1,10 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_01.tres" id="1"]
[node name="WallCorner01" type="CSGCombiner3D" parent="."]
[node name="WallCorner01" type="CSGCombiner3D"]
use_collision = false
visibility_range_end = 50.0
visibility_range_end_margin = 5.0
[node name="WallA" type="CSGBox3D" parent="WallCorner01"]
operation = 0
size = Vector3(2.56, 2.56, 0.16)
@@ -1,8 +1,10 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_01.tres" id="1"]
[node name="WallDoorway01" type="CSGCombiner3D" parent="."]
[node name="WallDoorway01" type="CSGCombiner3D"]
use_collision = false
visibility_range_end = 40.0
visibility_range_end_margin = 5.0
[node name="MainWall" type="CSGBox3D" parent="WallDoorway01"]
operation = 0
size = Vector3(2.56, 2.56, 0.16)
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_01.tres" id="1"]
[node name="WallEndcap01" type="CSGBox3D" parent="."]
[node name="WallEndcap01" type="CSGBox3D"]
size = Vector3(0.32, 2.56, 0.16)
material = ExtResource("1")
use_collision = true
visibility_range_end = 50.0
visibility_range_end_margin = 5.0
@@ -1,7 +1,9 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_01.tres" id="1"]
[node name="WallStraight01" type="CSGBox3D" parent="."]
[node name="WallStraight01" type="CSGBox3D"]
size = Vector3(2.56, 2.56, 0.16)
material = ExtResource("1")
use_collision = true
visibility_range_end = 50.0
visibility_range_end_margin = 5.0
@@ -1,8 +1,10 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Material" path="res://assets/materials/wall_concrete_01.tres" id="1"]
[node name="WallWindow01" type="CSGCombiner3D" parent="."]
[node name="WallWindow01" type="CSGCombiner3D"]
use_collision = false
visibility_range_end = 40.0
visibility_range_end_margin = 5.0
[node name="MainWall" type="CSGBox3D" parent="WallWindow01"]
operation = 0
size = Vector3(2.56, 2.56, 0.16)