champions-of-luneraria/docs/port/PORT-QA.md
Martin Stickelbroeck 714d0c697c U5.5 Schlackenklaue: zweite Meshy-Figur (g02)
Konzept aus Icon, Phase-4-Modell und Kohlenbeißer-Konzept als Stilvorlage,
Modell, Skelett und sieben Bibliotheks-Clips für 68 Credits; Figurendatei
vom Kohlenbeißer übernommen, Lane-Fassung inklusive. Bildwerkzeug und
Stresstest nehmen aufgewertete Truppen. Stresstest 35 Schlackenklauen:
Mid 152,5 -> 135,8 fps, Karte 116,7 -> 115,6. Tests grün, Fingerabdrücke
unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:44:03 +02:00

157 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Port-QA
Je Meilenstein: Tests, Bild, Leistung, bekannte Unterschiede, Commit.
## U1 · C#-Simulation
| Punkt | Ergebnis |
| --- | --- |
| Tests | `content` 75/75, `core` 91/91, `m2` 73/73, `golden` 157/157, `determinism` 6/6 = **402/402**; dreimal in getrennten Prozessen; Protokoll `logs/u1/core-tests.json` |
| Golden-Parität | 19 Szenarien, 120 Snapshots, 51.221 Werte; größte Abweichung 0 in allen Kategorien (Toleranzen siehe U1-RULES.md) |
| Bild | `screenshots/u1/replay-start_three_lanes-t10.png`, `replay-boss_cycle-marching.png`, `replay-grotto_contested-t15.png`: Godot-Positionen (Punkte) und C#-Positionen (Ringe) decken sich (31/31, 35/35, 15/15) |
| Leistung (Mac M5) | Simulationsschritt bei 120 Einheiten: Godot 1,587 ms, C#/.NET 8 0,259 ms; Bot-Partien pro Runde: 648 ms zu 36 ms (`logs/u1/sim-bench-*.json`) |
| Bekannte Unterschiede | technische Repräsentation (Klassen statt Dictionaries, stabile Sortierung, 32-Bit-int, kein ungenutzter Zufallsgenerator); Referenzfehler R1 bewusst übernommen |
| Offen | erledigt in U1.5: Lauf im Unity-Editor, Mono-Leistung. Weiter offen: Kerntests auf Windows 11 und Fedora 44 |
| Commit | Zweig `luneraria/u1` (`4d6ed17`) |
Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten im U1-Commit, weil `.gitignore` alle `*.csproj` ausschloss. Sie sind seit U1.5 eingecheckt.
## U1.5 · Unity-Integrationsprüfung
| Punkt | Ergebnis |
| --- | --- |
| Umgebung | Unity 6000.3.20f1 (6.3 LTS), Personal-Lizenz, URP 17.3.0, Editor-Mono 6.13.0, Standalone-Backend Mono, API-Level .NET Standard 2.1 |
| Tests | Unity Test Runner (EditMode): 402/402 in Release und Debug, dazu 2 Integrationstests; .NET 8 weiter 402/402. Protokolle `logs/u1_5/editmode-results-*.xml`, `core-tests-*.json` |
| Golden in Unity | 51.221 Werte, Abweichung 0 in allen Kategorien und Bereichen (Gold, HP, Positionen, Türme, Ancients, Wellen, Helden, Boss, Gewinner, …) |
| Float-Befund | Mono rechnet float32-Zwischenwerte doppelt genau. Das beeinflusste eine Zielentscheidung (`mirror_match` Runde 7: +4,8 s Kampfdauer). Behoben durch explizite Rundung in `Vec2`; .NET-Ergebnisse byteidentisch zu vorher |
| Bild | keines; U1.5 hat keine sichtbare Szene. Nachweis sind der Schritt-Trace (`tools/port/trace_diff.py`) und die Float-Probe (`logs/u1_5/float-probe-*.json`) |
| Leistung (Editor-Benchmark) | Schritt mit 120 Einheiten: Editor Release 0,51 ms, Debug 1,00 ms; .NET 8 0,24–0,26 ms; Godot 1,60 ms (`logs/u1_5/sim-bench-*.json`) |
| Bekannte Unterschiede | R1 bewusst übernommen; F1 (Mono-Float) behoben ([KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md)) |
| Offen | IL2CPP- und Player-Läufe unter Windows 11 und Fedora 44 (Build-Module fehlen, Installation nach Freigabe) |
| Commit | Zweig `luneraria/u1.5` |
## U2 · Unity-Spielwelt
| Punkt | Ergebnis |
| --- | --- |
| Tests | Blender-Pipeline 176/176 und Unity-Verifier 128/128 (9 Assets). Test Runner EditMode 11/11: Kern 402 Prüfungen, 2 Integrationstests, 4 Bildratentests. PlayMode 2/2: Szene bei echten Bildraten, Vertical Function Test |
| Parität | Bot-Partie Seed 2 (9 Runden) und Seed 9 ab Runde 21 in der sichtbaren Szene mit demselben Fingerabdruck wie der reine Kern; ebenso bei 30, 60, 120 fps, unbegrenzt, mit Rucklern und bei 8× Tempo |
| Bild | `screenshots/u2a/` (Assets), `u2b/` (Karte mit Godot-Kameraeinstellungen; Vergleich mit `g2/nachher`), `u2d/` (14 Schlüsselmomente der Partien) |
| Leistung | macOS-Player (M5, 1080p, VSync aus) mit 116 Einheiten: 161–199 fps; Hauptthread 1,3 ms, Render-Thread 1,3 ms, Simulation unter 0,1 ms. Ausreißer beim Present (p95 18–26 ms) offen für U5 |
| Bekannte Unterschiede | keine Verhaltensunterschiede. Darstellung vereinfacht: Platzhaltermodelle für Einheiten, Materialien, Effekte, Debug-Anzeige statt HUD ([U2-WORLD.md](U2-WORLD.md)) |
| Offen | Windows-/Linux-Player (Build-Module); Leistungsspitzen (Batch-Import inzwischen erledigt, siehe unten) |
| Commits | `luneraria/u2`: U2A `49cb4af`, U2B `8a72cb1`, U2C `3871b3e`, U2D `323cc3a` |
### Batch-Import aller Modelle (nach U2D)
| Punkt | Ergebnis |
| --- | --- |
| Tests | Blender-Pipeline 1.616/1.616 und Unity-Verifier 1.247/1.247 (86 Modelle); zwei Exportläufe byteidentisch. Test Runner EditMode 11/11, PlayMode 2/2 mit allen Modellen |
| Parität | Vertical Function Test mit allen Modellen: Seed 2 `DCE95C96556F3A1A` (12.690 Schritte), Seed 9 ab Runde 21 `7B8E43AEFC0D60C5` (4.195 Schritte), beide gleich dem Kern; Szene bei 30, 60, 120 fps und unbegrenzt gleich |
| Bild | `screenshots/u2a-batch/<Gruppe>.png` (Kontaktbögen aller Modelle), `screenshots/u2a-batch/01-…` bis `14-…` (Partie mit allen Modellen) |
| Leistung | macOS-Player mit allen Modellen, 116 Einheiten: 158–160 fps (Mid-Lane 205–207). Hauptthread 2,5 ms, Render-Thread 3,2 ms, etwa doppelt so viel wie mit dem Platzhalter. Present-Ausreißer kürzer (p95 18 statt 24 ms). Player 228 MB |
| Befund | Projekt liegt in iCloud Drive; Konfliktkopien im Build-Cache machten den Player unbrauchbar. `LunePlayerBuild` fängt das ab ([U2-WORLD.md](U2-WORLD.md)) |
| Bekannte Unterschiede | keine Verhaltensunterschiede; starre Figuren ohne Godots prozedurale Gliederbewegung |
| Offen | Draw Calls messen (U5); Windows-/Linux-Player (Build-Module) |
| Commit | `luneraria/u2`: Batch-Import `3ca38a8` (Modelle direkt in Git) |
## U3 · G3-HUD portieren
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 23/23 (Kern 402 Prüfungen, Sichtmodell, Bildraten-Logik). PlayMode 13/13: Verify A–I **718 Prüfungen, 0 Fehler** (Port von `verify_g3` 715/715 plus Teil I), Szene bei echten Bildraten, Vertical Function Test, Capture, UI-Toolkit-Probe. Bildwerkzeuge und Spieltest sind `Explicit`. Protokolle `logs/u3/`, Summen `tools/out/hud-verify-*.txt` |
| Parität | Bot-Partie Seed 2 `DCE95C96556F3A1A` (12.690 Schritte), Seed 9 ab Runde 21 `7B8E43AEFC0D60C5` (4.195 Schritte), beide unverändert gleich dem Kern |
| Bild | `screenshots/u3/motive-1920x1080/` (14 G3-Motive), dieselben als JPEG in `motive-1280x720/`, `motive-2560x1080/`, `motive-2560x1440/` (Nachtrag), `pruefung/` (Teile B–F), `aufloesungen/` (1152×720 … 2560×1440), `spieltest/` (Wellen 1–8) |
| Leistung | macOS-Player mit HUD, 116 Einheiten: 169 fps (Übersicht) und 218 fps (Mid nah). HUD-Skripte **0,090 bzw. 0,078 ms je Bild**; Simulation 0,09/0,04 ms, Ansichten 0,31/0,33 ms. Ausreißer beim Present (p95 10–13 ms) im Rahmen der U2D-Streuung. Rohdaten `logs/u3/player-benchmark-macos.json` |
| Bekannte Unterschiede | Godots deklarierte Schriftgewichte werden in der Referenz nie angewendet (String-Schlüssel „wght“); Port zeigt wie G3 Regular 400. Kein Hauptmenü, kein Grottenlicht. Details [U3-UI.md](U3-UI.md) und [KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md) |
| Nachtrag (7. Oktober 2026) | Spieltest über die echte Oberfläche: Wellen 1–8 gespielt, Ende in der Planung von Welle 9 (`logs/u3/playtest-log.txt`). Tooltip-Wertzeilen ohne Umbruch wie Godots `GridContainer`. Die im U3D-Commit genannten Motivsätze in drei weiteren Auflösungen nachgeholt (vom U3-Stand `e2aadcb`). Befund für U4: Startbildschirm nicht in der Szene eingebunden (behoben im U4-Nachtrag) |
| Offen | Hauptmenü und Netzwerk (U4); Schriftgewichte, Grottenlicht und weitere Darstellung (U5); Windows-/Linux-Player (Build-Module) |
| Commits | `luneraria/u3`: U3A `4dee9b1`, U3B/U3C `2b86c0d`, U3D `66867f3`; Nachtrag `luneraria/u3-nachtrag` = `527f7c5` (auf U5.2) |
## U4 · Netzwerk
| Punkt | Ergebnis |
| --- | --- |
| Tests | Protokoll `NetSuite` **43/43** (Port von `test_lune_net.gd`), Mehr-Runden-Loopback `NetRoundsSuite` **12/12** (Port von `net_rounds.py`, In-Prozess mit `LuneLoopback`), `LuneWireTests` Round-trip. EditMode 29/29, PlayMode 13/13, Kerntests .NET 457/457 (402 + 43 + 12) |
| Parität | Bot-Partien unverändert `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`; Mindestumfang M4 erfüllt (Ready, private Planung, Bot-Übernahme, Wiedereinstieg, Snapshots, Revanche, Disconnect, sechs Plätze) |
| Bild | Startbildschirm `LuneMainMenu` (Offline/Hosten/Beitreten), sichtbar erst seit dem Nachtrag: `screenshots/u4/startbildschirm/` (macOS-Player: Startbildschirm, Planung, Kampf, Verlassen-Dialog, zurück im Startbildschirm, zweite Partie); Partiefenster unverändert U3 |
| Leistung | keine eigenen Netz-Messungen; Rahmen 20/s wie in der Referenz (`LuneNet.FrameInterval` 0,05 s), 13 Floats je Einheit |
| Bekannte Unterschiede | TCP statt ENet (Rahmen auf demselben Socket, Verwerfen über Serial); Zwei-Prozess-Loopback als In-Prozess-Test; vereinfachtes Hauptmenü; „Menü“ fragt vor der Rückkehr (Godot kehrt sofort zurück) |
| Nachtrag (7. Oktober 2026) | Startbildschirm in der Szene: `LuneWorldBuilder` legt `LuneNetPlay` an, das Menü hat eine eigene Fläche über dem HUD, „Menü“ → „Zum Menü“ führt zum Startbildschirm zurück. Tests und Benchmark ohne Startbildschirm (`LuneMatchDriver.DirectStart`, `-luneBenchmark`). EditMode 29/29, PlayMode 14/14 mit neuem `StartScreenTests` (26/26), Verify 718/0, Fingerabdrücke unverändert. macOS-Player-Selbsttest `-luneSmoke` 26/26 (`logs/u4/smoke-macos.json`, Bilder `screenshots/u4/startbildschirm/`). Bestätigungslauf am 8. Oktober auf dem Endstand bei offenem Mac: EditMode 29/29, PlayMode 14/14 in einem Zug. Leistung A/B gegen U5.2 (`1b31f9b`), je drei Läufe abwechselnd: Übersicht 111,0–113,9 zu 112,5–114,5 fps, Mid nah 145,2–148,9 zu 146,7–150,0 fps, HUD 0,09–0,11 ms. Die Mittelwerte liegen 0,3 bzw. 1,1 % auseinander, innerhalb der Streuung; kein messbarer Unterschied (`logs/u4/benchmark-ab/`). Details [U4-NETWORK.md](U4-NETWORK.md#nachtrag-startbildschirm-in-der-szene-7-oktober-2026) |
| Offen | Windows-/Linux-Player (Build-Module); Internetpartie über mehrere Rechner; optional unzuverlässiger Rahmenkanal |
| Commits | `luneraria/u4` `769e622`; Nachtrag `luneraria/u4-nachtrag` = `d590fde` (auf U5.2), Bestätigung und Benchmark im Commit danach; in `luneraria/u5.3` zusammengeführt (`c62a1f4`), Szene dort neu gebaut, EditMode 29/29, PlayMode 14/14, Player-Selbsttest 26/26 (`logs/u4/smoke-macos-u5.3.json`) |
## U5 · Visuelle Neuausrichtung (Vertical Slice)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 13/13, Kerntests .NET 457/457. Keine Regeländerung; Fingerabdrücke der Bot-Partien unverändert |
| Parität | Golden 51.221 Werte unverändert, 0 Abweichungen; Darstellung liest nur |
| Bild | `screenshots/u5/mid-lane-*.png` (Übersicht, Türme, Ancient, Grotte, Weitwinkel); Vergleich mit `../saumwacht-godot/docs/luneraria/screenshots/g3/vorher-1920x1080/` und `zwischenstand-1920x1080/` |
| Leistung | macOS-Player mit PBR+Nebel+VFX, 116 Einheiten: 132 fps (Übersicht), 182 fps (Mid nah). HUD 0,088 bzw. 0,077 ms je Bild. Gegenüber U3 −20…−25 % |
| Kartenqualität | entschieden und umgesetzt: **Weg 2 (Stufen)** — Zielqualität im Lankorridor (22 m), Randstufe (Farbe + Steinschicht) in Bergen und Kluft. Nachweis `screenshots/u5/edge-mountains.png`, `lane-and-edge.png`; Leistung `logs/u5/player-benchmark-stufen.json` (133 / 180 fps) |
| Bekannte Unterschiede | Stufen statt flächiger Zielqualität (harte Grenze je Knoten); Figuren ohne Künstler-Sculpts; keine Decals/Partikel; LOD/Draw Calls offen |
| Offen | restliche Zonen und Einheitenmodelle auf Zielqualität; Künstler-Sculpts; LOD und Atlanten |
| Commits | `luneraria/u5` `2c1686b` (Slice), `luneraria/u5.2` `7fa038a` (Stufen) |
## U5.3 · Gebäude, Boss, Ringborke und Bildbefund
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 13/13 (Verify A–I 718/0), Kerntests .NET 457/457 |
| Parität | Fingerabdrücke der Bot-Partien unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`); Darstellung liest nur |
| Bild | `screenshots/u5.3/` (JPEG): alle drei Lanes, Rand und Weitwinkel; die 14 Kampfmomente des Vertical Function Test mit Einheiten, Held und Boss; die 14 G3-Motive mit HUD. Messung mit `tools/port/png_stats.py` |
| Befund | U5 war halb so hell und ohne Grün (Mid-Lane Helligkeit 0,27, Grün 0 %): doppelte Einfärbung durch die PBR-Albedos, Normal- und ORM-Karten als sRGB, 10:1-Streifen aus dem Backen, ein bleichender Treffer-Flash, Nebel 0,0085. Alle behoben; Mid-Lane jetzt 0,41–0,44 Helligkeit, 31–39 % Grün (U3: 0,45 / 27 %) |
| Leistung | A/B mit einem U5.2-Player unter gleicher Last: 91,4 gegen 93,8 fps (Karte), 124,9 gegen 125,3 fps (Mid nah), also kein messbarer Unterschied. Rohdaten `logs/u5.3/player-benchmark-u52-run*.json`, `-u53-run*.json` |
| Bekannte Unterschiede | keine im Verhalten; Einheitenmodelle weiter mit importierten Materialien, Sättigung unter Godot G3 (Look-Entscheidung) |
| Commits | `luneraria/u5.3` = `07fa457` |
## U5.4 · Figuren
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30 (4 neue zur SSAO-Option) |
| Parität | Fingerabdrücke der Bot-Partien unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`); Darstellung liest nur |
| Bild | `screenshots/u5.4/` (JPEG): Übersichtsbilder eingekleidet wie im Spiel, Lanes, 14 Kampfmomente, 14 G3-Motive mit HUD, Optionen mit SSAO-Schalter |
| Inhalt | Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht 0,35, Oberflächenstruktur nur in den HUD-Porträts); Ringborkes 4k-Satz am Schnittholz (Korrektur aus U5.3); SSAO standardmäßig an, abschaltbar; Steinkarte nur für Gelände, Stein, Pflaster und Erde |
| Leistung | A/B gegen U5.3 im selben Lauf: Mid nah 177,7 → 148,5 fps (−16 %), Karte 127,8 → 111,5 fps (−13 %); ohne SSAO −3,5 / −4,5 %. Rohdaten `logs/u5.4/player-benchmark-*.json` |
| Bekannte Unterschiede | keine im Verhalten. Geometrie der Figuren unverändert (Probelauf mit Fasen ohne sichtbaren Gewinn); neue Formen bräuchten Sculpts oder lizenzierte Modelle |
| Commits | `luneraria/u5.4` = `4883d95` |
## U5.5 · Figurenpilot Kohlenbeißer (Meshy)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (6 Werkzeuge `Explicit`), Verify A–I 718/0, Player-Selbsttest 30/30, Kerntests .NET 457/457, FigureViewsTests 1/1 |
| Parität | Fingerabdrücke der Bot-Partien unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`), `same_as_core` in beiden Vertical-Function-Läufen; Darstellung und Ersatzmodell lesen nur |
| Bild | `screenshots/u5.5/` und `u5.5-gpu/`: Figur allein (vorher/nachher), vier Spielmomente mit Phase-4 und Meshy (`spiel-vorher/`, `spiel-nachher/`), 14 Kampfmomente, `Characters.jpg`, `Units.jpg`, 14 G3-Motive |
| Inhalt | Meshy-Pipeline (`tools/meshy/`), Kohlenbeißer `g01` ersetzt das Phase-4-Modell (`"replaces"`), UV-Material mit Lava-Glut aus Albedo-Alpha, Schattenwurf ohne Normalen-Versatz (UV-Nähte), GPU-Batched-Skinning, Benchmark-Optionen `-luneBenchmarkRound`/`-luneBenchmarkArmy` |
| Leistung | Figuren-Stress (35× g01): Meshy −21 % Mid / −13 % Karte gegenüber Phase-4 (CPU-Skinning). GPU-Skinning hebt Mid um 7–27 % und entlastet Haupt-/Render-Thread. Standard-Partie ab Runde 21 ohne `g01` im Bild: drei Varianten ≤ 6 %. Rohdaten `logs/u5.5/ab55*-*.json` |
| Bekannte Unterschiede | keine im Verhalten. Geometrie und Textur der Figur wechseln (Meshy statt Phase-4); Anatomie/Gesicht/Haar aus dem generierten Modell, nicht aus Künstler-Sculpts. Lava-Glut pauschal (keine Emission-Map). Schatten der Figur nur mit Tiefen-Bias |
| Commits | `luneraria/u5.5-pilot` = `c386206` |
## U5.5 · Lane-Fassung (LOD)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung 20/0 |
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
| Inhalt | Kohlenbeißer mit Lane-Fassung (4.998 statt 20.714 Dreiecke, LODGroup aus dem Export), Porträts in voller Fassung |
| Leistung | Stresstest 35 Kohlenbeißer: Mid 109,8 → 120,2 fps (starr 133,3), Karte 93,9 → 103,8 fps (starr 106,4). Rohdaten `logs/u5.5-lod/` |
| Bild | `screenshots/u5.5-lod/` (Figur, vier Spielmomente, 14 Kampfmomente) |
| Commits | `luneraria/u5.5-lod` |
## U5.5 · Schlackenklaue (g02)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung 20/0 |
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
| Inhalt | Meshy-Figur für `g02` mit Lane-Fassung, 68 Credits; Werkzeuge nehmen aufgewertete Truppen (`LUNE_FIGURE`, `-luneBenchmarkArmy g02`) |
| Leistung | Stresstest 35 Schlackenklauen: Mid 152,5 → 135,8 fps, Karte 116,7 → 115,6 fps. Rohdaten `logs/u5.5-g02/` |
| Bild | `screenshots/u5.5-g02/` |
| Commits | `luneraria/u5.5-g02` |
## Ausblick
Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux.