Skip to content

Debugging und Profiling

Game3D-Encounter-Diagnose

Dungeon-Runs mit Developer Seed zeigen kurze, nicht-blockierende Encounter-Hinweise. Der einzelne Controller-Export EnableEncounterDevelopmentNotifications ist der lokale Schalter; andere Seed-Arten unterdruecken diese Hinweise zentral. Fuer eine komplette Spur vom Raumeintritt bis zum Reward nach event=EncounterFlow. filtern und die Felder runId, roomId und encounterId korrelieren. Reihenfolge und Fehlerbilder stehen in Encounters, Gegner und Bosse.

Werkzeuge

  • Godot Debugger: Errors, Orphan Nodes, Monitors und Network Profiler.
  • Remote Scene Tree/Inspector: tatsächliche Nodes, Transforms, Collision und Signals.
  • Godot Profiler: Script/Physics/Rendering, Frame Time, Draw Calls und Memory.
  • Rider: Breakpoints in Bootstrap, Run-Controller, Netzwerk-RPCs und Services.
  • NetworkStatsOverlay-Autoload: Laufzeit-Netzwerkdaten.
  • Containerlogs: docker compose ... logs -f <service>.
  • Dungeonlogs: DungeonRun3DController loggt Seed, Hash, Template, Rotation, Doors, Roomwechsel und Objectives.

Projektspezifische Hot Paths

PlayerController._PhysicsProcess, Movement3DComponent.Move, DungeonEnemy3D._PhysicsProcess, HubNetworkSync.ServerUpdateHubPlayer, Remote-Avatar-Interpolation, Projectiles und Replay-Checkpoint-Erfassung. Prüfe Allokationen, LINQ, JSON-Serialisierung, Node-Suchen und ungedrosselte Logs. Template-/Catalog-Validierung ist Setup und kein Frame-Hot-Path.

Diagnosepfade

Symptom Zuerst prüfen Typische Ursache
Spieler jittert HubNetworkSync, MovementValidator, Remote-Avatar, Netzwerkoverlay falsche World-Unit-Konvertierung, Inputintervall, HardSnap/TeleportThreshold, Packet loss
Waffe feuert nicht PlayerController.Authority, AdvancedWeaponController, attack_primary Input-Lock, Combat deaktiviert, Authority-Command abgelehnt, kein aktives Loadout
Raum generiert nicht DungeonRun3DController.GenerateWorld, DungeonGeneratorV3, Catalog-Fehlertext falscher Mode, ungültiger Seed/Profile, kein exakter Template-Kandidat
Tür bleibt geschlossen RuntimeDoor3D, RuntimeDoorRoomLockController, RoomDoorSocket3D Encounter nicht complete, Socket mit Runtime-Door verwechselt, Startgate offen
Gegner spawnt nicht EncounterSpawnRequestFactory, RoomEncounterRuntime3D, Markerindex Objective enthält keinen Initial-Gegner, Marker-ID fehlt, Raum noch nicht aktiviert
Boss zählt nicht EnemyRuntimeContext.IsBoss, DungeonObjectiveTracker.RegisterEnemyKilled EnemyInstanceId stimmt nicht mit RequiredBossIds, Died-Handler nicht gebunden
Exit bleibt zu DungeonObjectiveTracker3D HUD, DungeonExitController3D Bossquote oder Enemy-Points nicht erfüllt; DEV 50 %, Standard 80 %
Loadout ungültig LoadoutValidationIssue.Code Locked/denied, falscher Mod-Slot, inkompatibel, Mastery-Tierkonflikt
Unlock sichtbar, Waffe gesperrt UnlockService, Snapshot, RequiredUnlockId falsche stabile ID oder Snapshot nicht persistiert; Backend fehlt
Replay weicht ab Seed, RunDefinition-/Policy-/Loadout-Hash, Tick-/Eventreihenfolge, Checkpoints Capability-Gate, fehlende Spawn-/Hazard-Events oder Client-/Nakama-Schema nicht synchron
Client verbindet nicht Main-Menu-Status, Nakama- und Registrylogs Auth-Key/URL, kein joinbarer Hub, ENet-Port/PublicHost falsch
Release verbindet nicht Production-Config und RuntimeConfigValidator Placeholder-Key, HTTP/Loopback oder deaktivierter Replay-Upload

Dungeon deterministisch untersuchen

Nutze DungeonTemplateIntegrationTest.tscn mit TestSeed = template-integration-01. Vergleiche DungeonHash, Template-ID, Rotation und offene Sockets zwischen Läufen. Für große Layouts verwende einen normalen/daily/manual Seed; Developer-Seeds wählen bewusst das kleine Profil.

Siehe Troubleshooting, Multiplayer und Raumtemplates.