6.4 Atkļūdošana un profilēšana
Stundas uzdevums: Apgūt Godot debugger, breakpoints, un izmantot to, lai atrastu bugs.
80 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~20 min) - atrodi kļūdu ar izdrukām · 2. uzdevums (~25 min) - lieto breakpoint un mainīgo skatu · 3. uzdevums (~20 min) - atrodi lēnāko vietu ar profileri · Iesniegšana (~5 min).
Pirms sāc: atver savu spēli. Šodien apzināti salauzīsi kodu un tad mācīsies to atrast - tā ir prasme, ko vajadzēs katrā projektā.
Teorija: Debugger un profileris
Godot piedāvā vairākus rīkus problēmu atrašanai:
- Output panel -
GD.Print()unGD.PrintErr()ziņojumi. - Debugger - breakpoints, step through, watch variables.
- Profiler - funkciju laika analīze.
- Network Profiler - RPC un networking.
- Visual Profiler - vizuāls diagrammu uzziņa.
// Debugging C# kodā
GD.Print("Player position: ", Position);
GD.PrintErr("Error: enemy is null!");
GD.PushWarning("Suspicious value: " + value);
// Pašpārbaudes
if (player == null)
{
GD.PrintErr("Player not found!");
return;
}
if (hp < 0)
{
throw new System.InvalidOperationException("Negative HP!");
}
// Nosacīta debug izvade
#if DEBUG
GD.Print("Function called: ", nameof(TakeDamage));
#endif
Kā šo izmantot projektā
Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C# klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.
Pārbaudi: UI signāli, audio darbības, debug izvade un publicēšanas sagatave ir sasaistīta ar C# spēles stāvokli.
public class PolishCheckpoint
{
public string Lesson = "6.4 Atkļūdošana un profilēšana";
public bool UsesCSharp = true;
public bool ConnectsUiSignals = true;
public bool RoutesAudioEvents = true;
public bool VerifiesExportBuild = true;
}
Praktiskie uzdevumi
1. uzdevums -
Atrodi kļūdu ar izdrukām
Beigās tu pratīsi atrast, kurā vietā vērtība kļūst nepareiza.
- Ievies savā kodā apzinātu kļūdu, piemēram nomaini
+uz-. - Palaid spēli un pieraksti, kas izskatās nepareizi.
- Pievieno
GD.Print("pozicija: ", Position);pirms aprēķina. - Pievieno tādu pašu izdruku pēc aprēķina.
- Palaid un salīdzini abas vērtības.
- Atrodi pēc izdrukām precīzo rindu, kur vērtība kļūst nepareiza.
- Salabo kļūdu un izdzēs izdrukas.
Gatavs, kad: tu vari nosaukt konkrētu rindu, kurā vērtība kļuva nepareiza, un kļūda ir izlabota.
2. uzdevums -
Lieto breakpoint un mainīgo skatu
Beigās tu pratīsi apturēt spēli un apskatīt visus mainīgos uzreiz.
- Atver cilni Debugger.
- Uzliec breakpoint uz vienas koda rindas, uzklikšķinot rindas numura kreisajā malā.
- Palaid spēli un pagaidi, līdz tā apstājas.
- Apskati panelī Stack Variables visu mainīgo vērtības.
- Nospied Step Into un vēro, kā izpilde iet pa vienai rindai.
- Pieraksti, kāda vērtība bija tavam galvenajam mainīgajam.
- Pieraksti, kad breakpoint ir ērtāks par izdrukām.
Gatavs, kad: spēle apstājas norādītajā rindā, un tu vari nolasīt mainīgo vērtības, tās neizdrukājot.
3. uzdevums -
Atrodi lēnāko vietu ar profileri
Beigās tu zināsi, kura funkcija patērē visvairāk laika.
- Atver Debugger -> Profiler un nospied Start.
- Spēlē 30 sekundes ar aktīvu spēli.
- Aptur profileri un sakārto sarakstu pēc laika.
- Pieraksti trīs funkcijas, kas aizņem visvairāk laika.
- Pārbaudi, vai kāda no tām tiek izsaukta biežāk, nekā vajadzētu.
- Salīdzini
_Processun_PhysicsProcesskopējo laiku. - Pieraksti vienu ideju, ko varētu uzlabot.
Gatavs, kad: tev ir pierakstītas trīs laikietilpīgākās funkcijas un viena konkrēta uzlabojuma ideja.
Papildu uzdevums - Pievieno pašpārbaudes izdrukas
Ja pamatdarbs ir gatavs, liec kodam pašam brīdināt par kļūdām.
- Pievieno pārbaudi, vai svarīgs mezgls tiešām tika atrasts.
- Izdrukā
GD.PrintErr("Nav atrasts mezgls!");, ja tas irnull. - Pārsauc mezglu scēnā un palaid spēli.
- Pieraksti, ar ko sarkanā
GD.PrintErrizdruka atšķiras no parastās. - Atgriez nosaukumu un pārbaudi, ka brīdinājums pazūd.
Gatavs, kad: pārsaucot mezglu, konsolē parādās sarkans brīdinājums, nevis spēle klusi avarē.
Ko sagatavo
Stundas mērķis: Tu proti atrast kļūdu trīs veidos: ar izdrukām, ar breakpoint un mainīgo skatu, un ar profileri atrast laikietilpīgāko funkciju.
GitHub krātuvē jābūt:
- Ekrānuzņēmums ar Debugger paneli, kurā spēle apturēta breakpoint vietā un redzami mainīgie.
- Ekrānuzņēmums ar profilera sarakstu, sakārtotu pēc laika.
- README.md: kura rinda saturēja apzināti ievesto kļūdu un kā tu to atradi.
- README.md: trīs laikietilpīgākās funkcijas un viena uzlabojuma ideja.
Kā iesniedz: Veic commit un push. Skolotāja norādītajā vietā ievieto tikai GitHub krātuves saiti; visiem prasītajiem failiem, README.md pierakstiem un pierādījumiem jābūt pašā krātuvē.
Biežākās kļūdas
- Breakpoint nestrādā: Palaid projektu no Godot .NET debug režīmā un pārliecinies, ka C# projekts ir uzbūvēts bez kļūdām.
- Print panel pārplūst: Pārāk daudz print - lieto conditional vai noņem.
- Profiler crashes: Pārliecinies par jaunāko Godot versiju.
Godot ekrānuzņēmumi
Koda piemērs (paplašināts)
using Godot;
using System;
public partial class Player : CharacterBody2D
{
[Signal] public delegate void DamagedEventHandler(int amount);
private string playerName = "Player";
private int hp = 100;
public void TakeDamage(int amount)
{
// Validate input
if (amount < 0)
throw new ArgumentOutOfRangeException(nameof(amount), amount,
"Damage amount must be non-negative.");
// Log for debugging
GD.Print("Player ", playerName, " taking ", amount,
" damage. Current HP: ", hp);
// Apply damage
hp = Math.Max(0, hp - amount);
// Conditional debug
#if DEBUG
if (hp == 0)
{
GD.Print("Player died at position ", Position);
}
#endif
EmitSignal(SignalName.Damaged, amount);
}
}