Spike: Wie viele Gegner und Projektile trägt Bevy 0.19 in 2D? #4

Closed
opened 2026-08-10 07:58:32 +00:00 by RDietermann · 1 comment
Owner

Part of #1

Ein Wegwerf-Beispiel (examples/perf_spike.rs), das das Budget misst, bevor wir Architektur darauf bauen.

Aufbau: N Gegner bewegen sich radial auf die Mitte zu, der Turm feuert mit fester Rate, Projektile fliegen, Treffer entfernen Gegner. Kein Gameplay, keine UI.

Messen: Frametime bei N = 100 / 500 / 2000 / 10000, mit Sprites, im Release-Profil. Wo kippt es unter 60 fps? Was dominiert — Spawning, Kollision oder Rendering?

Ergebnis: eine Tabelle als Kommentar in diesem Ticket, plus ein Satz Empfehlung: mit welcher Gegnerzahl planen wir, und braucht Kollision eine räumliche Struktur oder reicht naives O(n·m)?

Fertig, wenn die Zahl im Ticket steht. Der Spike-Code ist kein Teil des Slice — er bleibt unter examples/ liegen oder fliegt raus.

Part of #1 Ein Wegwerf-Beispiel (`examples/perf_spike.rs`), das das Budget misst, bevor wir Architektur darauf bauen. **Aufbau**: N Gegner bewegen sich radial auf die Mitte zu, der Turm feuert mit fester Rate, Projektile fliegen, Treffer entfernen Gegner. Kein Gameplay, keine UI. **Messen**: Frametime bei N = 100 / 500 / 2000 / 10000, mit Sprites, im Release-Profil. Wo kippt es unter 60 fps? Was dominiert — Spawning, Kollision oder Rendering? **Ergebnis**: eine Tabelle als Kommentar in diesem Ticket, plus ein Satz Empfehlung: mit welcher Gegnerzahl planen wir, und braucht Kollision eine räumliche Struktur oder reicht naives O(n·m)? **Fertig, wenn** die Zahl im Ticket steht. Der Spike-Code ist kein Teil des Slice — er bleibt unter `examples/` liegen oder fliegt raus.
RDietermann added the wayfinder:prototype label 2026-08-10 07:58:32 +00:00
RDietermann changed title from Spike: Wie viele Gegner und Projektile tragt Bevy 0.19 in 2D? to Spike: Wie viele Gegner und Projektile trägt Bevy 0.19 in 2D? 2026-08-10 08:00:35 +00:00
RDietermann self-assigned this 2026-08-10 08:17:26 +00:00
Author
Owner

Erledigt in 40a19f3. examples/perf_spike.rs liegt auf slice/frontier, der vollständige Messbericht steht im Ticket-Verlauf.

Ergebnis: unter 60 fps kippt es bei ~70 000 Sprites; Rendering dominiert mit 96–98 %, die gesamte Gameplay-Logik kostet bei 10 000 Gegnern 0,114 ms von 16,67 ms. Kollision ist mit 1,5–6,5 ns pro Paartest exakt linear in n·m — naiv reicht bis ~5·10⁵ Paartests/Frame, danach Uniform Grid.

Entschieden: Obergrenze 10 000 gleichzeitige Gegner, steigend über den Run (siehe Decisions in #1). Nicht die gemessenen 70 000, weil die Messung für untexturierte, gleichfarbige Sprites ohne UI und Audio gilt.

Zwei Befunde, die über das Ticket hinausgehen und in #1 dokumentiert sind: der nächste Perf-Hotspot ist nicht die Kollision, sondern tower_fire mit seinem O(n)-Zielscan sobald es mehrere Türme gibt — und Gegner-gegen-Gegner-Kollision wird bei dieser Gegnerzahl zur offenen Architekturfrage (Stapeln zulassen oder Spatial Grid mit weicher Separation).

Der Spike bleibt als examples/ liegen, damit die Messung nach dem Wechsel auf echte Texturen wiederholbar ist.

Erledigt in `40a19f3`. `examples/perf_spike.rs` liegt auf `slice/frontier`, der vollständige Messbericht steht im Ticket-Verlauf. **Ergebnis**: unter 60 fps kippt es bei ~70 000 Sprites; Rendering dominiert mit 96–98 %, die gesamte Gameplay-Logik kostet bei 10 000 Gegnern 0,114 ms von 16,67 ms. Kollision ist mit 1,5–6,5 ns pro Paartest exakt linear in n·m — naiv reicht bis ~5·10⁵ Paartests/Frame, danach Uniform Grid. **Entschieden**: Obergrenze **10 000 gleichzeitige Gegner**, steigend über den Run (siehe Decisions in #1). Nicht die gemessenen 70 000, weil die Messung für untexturierte, gleichfarbige Sprites ohne UI und Audio gilt. Zwei Befunde, die über das Ticket hinausgehen und in #1 dokumentiert sind: der nächste Perf-Hotspot ist nicht die Kollision, sondern `tower_fire` mit seinem O(n)-Zielscan sobald es mehrere Türme gibt — und Gegner-gegen-Gegner-Kollision wird bei dieser Gegnerzahl zur offenen Architekturfrage (Stapeln zulassen oder Spatial Grid mit weicher Separation). Der Spike bleibt als `examples/` liegen, damit die Messung nach dem Wechsel auf echte Texturen wiederholbar ist.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RDietermann/InfiniTower#4