U4-Nachtrag: Bestätigungslauf und Player-Benchmark

Nachgeholt bei offenem Mac auf dem Endstand acf2572; die nächtlichen
Wiederholungsläufe zählen nicht (Mac zugeklappt, nur Wartungs-Wachphasen).

- EditMode 29/29, PlayMode 14/14 in einem Zug (StartScreenTests 26/26,
  Verify 718/0), Fingerabdrücke DCE95C96556F3A1A und 7B8E43AEFC0D60C5
  gleich dem Kern, Szene bei 30, 60, 120 fps und unbegrenzt ebenso.
- Neu gebauter macOS-Player: Selbsttest -luneSmoke wieder 26/26.
- -luneBenchmark behält seine Bot-Partie (Seed 9 ab Runde 21, 116 Einheiten).
  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; Mittelwerte 0,3 bzw. 1,1 % auseinander, innerhalb der
  Streuung. Rohdaten in docs/port/logs/u4/benchmark-ab/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Martin Stickelbroeck 2026-10-08 14:00:26 +02:00
parent acf2572955
commit dafcaae5f5
8 changed files with 99 additions and 6 deletions

View file

@ -77,9 +77,9 @@ Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten
| 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/`). Offen: ein zusammenhängender PlayMode-Lauf auf dem Endstand und ein Player-Benchmark; der Mac schlief zugeklappt während der Wiederholungsläufe. Details [U4-NETWORK.md](U4-NETWORK.md#nachtrag-startbildschirm-in-der-szene-7-oktober-2026) |
| 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) |
| Commits | `luneraria/u4` `769e622`; Nachtrag `luneraria/u4-nachtrag` = `d590fde` (auf U5.2), Bestätigung und Benchmark im Commit danach |
## U5 · Visuelle Neuausrichtung (Vertical Slice)

View file

@ -105,13 +105,22 @@ Beim Einbinden zeigten sich zwei weitere Fehler. Sie hätten den Startbildschirm
| Prüfung | Ergebnis |
| --- | --- |
| `StartScreenTests` (PlayMode, neu) | 26/26 Prüfungen im Editor (Selbsttest ohne Bilder) |
| macOS-Player, `-luneSmoke` | 26/26 in 10,8 s (Release, Metal, 1920×1080). Bilder `screenshots/u4/startbildschirm/`, Bericht `logs/u4/smoke-macos.json`, Protokoll `logs/u4/smoke-macos-log.txt` |
| macOS-Player, `-luneSmoke` | 26/26 in 10,8 s (Release, Metal, 1920×1080). Bilder `screenshots/u4/startbildschirm/`, Bericht `logs/u4/smoke-macos.json`, Protokoll `logs/u4/smoke-macos-log.txt`. Im Bestätigungslauf mit neu gebautem Player wieder 26/26 |
| EditMode | 29/29 |
| PlayMode | 14/14 (13 + `StartScreenTests`), Verify A–I 718/0. Zu den Läufen siehe unten |
| PlayMode | 14/14 (13 + `StartScreenTests`), Verify A–I 718/0. Bestätigungslauf auf dem Endstand (`acf2572`) am 8. Oktober in einem Zug, 307 s |
| Fingerabdrücke der Bot-Partien | Seed 2 `DCE95C96556F3A1A` (12.690 Schritte), Seed 9 ab Runde 21 `7B8E43AEFC0D60C5` (4.195 Schritte): gleich dem Kern und unverändert, in der Szene auch bei 30, 60, 120 fps und unbegrenzt |
| Benchmark `-luneBenchmark` | `LuneNetPlay` bleibt aus, die Bot-Partie bleibt (Code; die Szenentests nehmen denselben Weg ohne Startbildschirm). Ein Player-Lauf steht aus |
| Benchmark `-luneBenchmark` | `LuneNetPlay` bleibt aus, die Bot-Partie bleibt (Seed 9 ab Runde 21, bis 116 Einheiten). A/B gegen U5.2 unter gleichen Bedingungen, siehe unten |
Zu den PlayMode-Läufen: Der erste vollständige Lauf (7. Oktober, 23:28) ergab 14/14. Ihm fehlte nur die Menübreite, eine Layoutzeile, die kein Test liest. Danach wurde der Mac zugeklappt. Er ging in den Ruhezustand („Thermal Emergency Sleep“ um 23:35) und wachte nur noch alle 15 Minuten kurz für Wartung auf. Drei weitere Läufe auf dem Endstand liefen nur in diesen Wachphasen; jeder Test bestand darin mindestens einmal. Der Lauf vom 8. Oktober (05:14) ergab 12/14, mit Bildraten und Vertical Function Test; `F_Input` und `StartScreenTests` bestanden in den Läufen davor und danach. Fehlschläge gab es nur an Echtzeitgrenzen, wenn der Mac dazwischen schlief: Bildratenläufe über 600 s, der 120-s-Wächter des Selbsttests und eine Kameraprüfung 0,6 s nach einem Lane-Klick. Ein zusammenhängender Lauf auf dem Endstand bei geöffnetem Mac steht aus.
**Leistung (A/B):** Je drei Benchmark-Läufe abwechselnd mit einem U5.2-Player (`1b31f9b`, ohne Nachtrag) und dem Nachtrag-Player (`acf2572`); zuvor ein verworfener Aufwärmlauf, weil macOS neue Programme beim ersten Start prüft. macOS-Player, Release, Metal, 1920×1080, VSync aus, Mac M5 bei normaler Desktop-Nutzung. Rohdaten `logs/u4/benchmark-ab/`.
| Player | Übersicht (Zoom 64) | Mid nah (Zoom 22) | HUD-Skripte je Bild | Einheiten |
| --- | --- | --- | --- | --- |
| U5.2 `1b31f9b` | 112,5 / 114,5 / 112,9 fps | 146,7 / 150,0 / 147,7 fps | 0,088–0,103 ms | 116 / 63 |
| U4-Nachtrag `acf2572` | 111,0 / 113,9 / 113,9 fps | 145,2 / 148,9 / 145,4 fps | 0,090–0,109 ms | 116 / 63 |
Die Mittelwerte liegen 0,3 % (Übersicht) und 1,1 % (Mid nah) auseinander. Das ist weniger als die Streuung zwischen den Läufen eines Players (bis 2,6 %). Im Benchmark baut `LuneNetPlay` kein Menü und hat keine Bildarbeit. Beide Player liegen unter den U5.2-Zahlen vom 2. Oktober (133 / 180 fps). Der Abstand trifft beide gleich und hängt an der Umgebung. Heute brauchen beide Player in der Übersicht länger als damals: Hauptthread 3,6–3,7 statt 3,1 ms, Render-Thread 4,2–4,5 statt 3,7 ms, Present-Wartezeit 5,3 statt 4,4 ms.
Die nächtlichen Wiederholungsläufe vom 7. auf den 8. Oktober zählen nicht. Der Mac war zugeklappt („Thermal Emergency Sleep“ um 23:35) und wachte nur alle 15 Minuten kurz für Wartung auf. Dabei rissen Echtzeitgrenzen: Bildratenläufe über 600 s, der 120-s-Wächter des Selbsttests und eine Kameraprüfung 0,6 s nach einem Lane-Klick. Der Bestätigungslauf bei geöffnetem Mac ersetzt sie.
## Bekannte Grenzen

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2222, "fps": 111.0, "frame_ms_avg": 9.01, "frame_ms_median": 6.31, "frame_ms_p95": 19.48, "frame_ms_p99": 24.20, "frame_ms_max": 37.92, "frames_over_16_7_ms": 208, "of_them_with_simulation_step": 18, "gc_collections": 27, "simulation_ms_per_frame": 0.150, "views_ms_per_frame": 0.312, "ui_ms_per_frame": 0.109, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.71 / median 3.57 / p95 5.19 ms, render thread avg 4.47 / median 4.42 / p95 5.36 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.30 / median 2.24 / p95 15.99 ms
{"view": "mid lane close (zoom 22)", "frames": 1454, "fps": 145.2, "frame_ms_avg": 6.88, "frame_ms_median": 4.89, "frame_ms_p95": 16.19, "frame_ms_p99": 20.28, "frame_ms_max": 28.97, "frames_over_16_7_ms": 53, "of_them_with_simulation_step": 8, "gc_collections": 10, "simulation_ms_per_frame": 0.068, "views_ms_per_frame": 0.395, "ui_ms_per_frame": 0.096, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 3.01 / median 2.92 / p95 4.20 ms, render thread avg 3.53 / median 3.49 / p95 4.17 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.88 / median 1.75 / p95 13.37 ms
]
}

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2278, "fps": 113.9, "frame_ms_avg": 8.78, "frame_ms_median": 5.91, "frame_ms_p95": 20.29, "frame_ms_p99": 24.14, "frame_ms_max": 39.11, "frames_over_16_7_ms": 279, "of_them_with_simulation_step": 31, "gc_collections": 28, "simulation_ms_per_frame": 0.137, "views_ms_per_frame": 0.296, "ui_ms_per_frame": 0.107, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.47 / median 3.35 / p95 4.84 ms, render thread avg 4.14 / median 4.11 / p95 4.84 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.31 / median 2.08 / p95 17.17 ms
{"view": "mid lane close (zoom 22)", "frames": 1489, "fps": 148.9, "frame_ms_avg": 6.72, "frame_ms_median": 4.69, "frame_ms_p95": 16.57, "frame_ms_p99": 20.87, "frame_ms_max": 27.87, "frames_over_16_7_ms": 68, "of_them_with_simulation_step": 9, "gc_collections": 9, "simulation_ms_per_frame": 0.067, "views_ms_per_frame": 0.369, "ui_ms_per_frame": 0.090, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 2.91 / median 2.81 / p95 4.15 ms, render thread avg 3.40 / median 3.34 / p95 4.10 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.80 / median 1.66 / p95 13.95 ms
]
}

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2278, "fps": 113.9, "frame_ms_avg": 8.78, "frame_ms_median": 5.90, "frame_ms_p95": 19.84, "frame_ms_p99": 24.07, "frame_ms_max": 31.30, "frames_over_16_7_ms": 226, "of_them_with_simulation_step": 31, "gc_collections": 27, "simulation_ms_per_frame": 0.133, "views_ms_per_frame": 0.289, "ui_ms_per_frame": 0.100, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.45 / median 3.34 / p95 4.85 ms, render thread avg 4.11 / median 4.09 / p95 4.88 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.33 / median 2.05 / p95 16.59 ms
{"view": "mid lane close (zoom 22)", "frames": 1455, "fps": 145.4, "frame_ms_avg": 6.88, "frame_ms_median": 4.93, "frame_ms_p95": 16.39, "frame_ms_p99": 19.99, "frame_ms_max": 31.61, "frames_over_16_7_ms": 54, "of_them_with_simulation_step": 2, "gc_collections": 10, "simulation_ms_per_frame": 0.066, "views_ms_per_frame": 0.385, "ui_ms_per_frame": 0.094, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 3.08 / median 2.93 / p95 4.60 ms, render thread avg 3.54 / median 3.47 / p95 4.41 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.81 / median 1.84 / p95 13.45 ms
]
}

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2251, "fps": 112.5, "frame_ms_avg": 8.89, "frame_ms_median": 6.09, "frame_ms_p95": 19.80, "frame_ms_p99": 24.20, "frame_ms_max": 32.50, "frames_over_16_7_ms": 200, "of_them_with_simulation_step": 27, "gc_collections": 27, "simulation_ms_per_frame": 0.139, "views_ms_per_frame": 0.297, "ui_ms_per_frame": 0.103, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.61 / median 3.46 / p95 5.21 ms, render thread avg 4.23 / median 4.18 / p95 5.10 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.27 / median 2.11 / p95 16.38 ms
{"view": "mid lane close (zoom 22)", "frames": 1469, "fps": 146.7, "frame_ms_avg": 6.82, "frame_ms_median": 4.80, "frame_ms_p95": 16.30, "frame_ms_p99": 20.28, "frame_ms_max": 28.26, "frames_over_16_7_ms": 46, "of_them_with_simulation_step": 7, "gc_collections": 10, "simulation_ms_per_frame": 0.071, "views_ms_per_frame": 0.384, "ui_ms_per_frame": 0.092, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 2.98 / median 2.88 / p95 4.23 ms, render thread avg 3.46 / median 3.39 / p95 4.25 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.82 / median 1.73 / p95 13.50 ms
]
}

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2290, "fps": 114.5, "frame_ms_avg": 8.73, "frame_ms_median": 5.86, "frame_ms_p95": 20.25, "frame_ms_p99": 24.29, "frame_ms_max": 30.15, "frames_over_16_7_ms": 276, "of_them_with_simulation_step": 36, "gc_collections": 27, "simulation_ms_per_frame": 0.135, "views_ms_per_frame": 0.284, "ui_ms_per_frame": 0.098, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.39 / median 3.27 / p95 4.75 ms, render thread avg 4.08 / median 4.07 / p95 4.77 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.34 / median 2.08 / p95 16.96 ms
{"view": "mid lane close (zoom 22)", "frames": 1500, "fps": 150.0, "frame_ms_avg": 6.67, "frame_ms_median": 4.62, "frame_ms_p95": 16.47, "frame_ms_p99": 20.54, "frame_ms_max": 24.49, "frames_over_16_7_ms": 60, "of_them_with_simulation_step": 6, "gc_collections": 10, "simulation_ms_per_frame": 0.067, "views_ms_per_frame": 0.369, "ui_ms_per_frame": 0.088, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 2.80 / median 2.74 / p95 3.83 ms, render thread avg 3.34 / median 3.30 / p95 3.89 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.88 / median 1.74 / p95 13.78 ms
]
}

View file

@ -0,0 +1,14 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 21 (fixture high_wave_21), speed 1x, measured after 10 s of combat",
"windows": [
{"view": "overview (zoom 64)", "frames": 2259, "fps": 112.9, "frame_ms_avg": 8.85, "frame_ms_median": 6.02, "frame_ms_p95": 20.30, "frame_ms_p99": 24.38, "frame_ms_max": 31.61, "frames_over_16_7_ms": 286, "of_them_with_simulation_step": 24, "gc_collections": 27, "simulation_ms_per_frame": 0.131, "views_ms_per_frame": 0.286, "ui_ms_per_frame": 0.102, "units_alive_max": 116},
// timings overview (zoom 64): main thread avg 3.57 / median 3.39 / p95 5.10 ms, render thread avg 4.20 / median 4.17 / p95 4.99 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.29 / median 2.09 / p95 16.93 ms
{"view": "mid lane close (zoom 22)", "frames": 1477, "fps": 147.7, "frame_ms_avg": 6.77, "frame_ms_median": 4.79, "frame_ms_p95": 16.34, "frame_ms_p99": 20.67, "frame_ms_max": 24.58, "frames_over_16_7_ms": 59, "of_them_with_simulation_step": 6, "gc_collections": 10, "simulation_ms_per_frame": 0.067, "views_ms_per_frame": 0.366, "ui_ms_per_frame": 0.088, "units_alive_max": 63}
// timings mid lane close (zoom 22): main thread avg 2.89 / median 2.78 / p95 4.24 ms, render thread avg 3.44 / median 3.39 / p95 4.15 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 3.87 / median 1.78 / p95 13.70 ms
]
}