Skip to main content

performance

FlatRedBallService.Performance — opt-in rolling FPS/timing/collision stats. Triggers: PerformanceMonitor, GenerateReport, FPS, frame time, DeepCollisionCount, "why is my game slow".

الانتقال إلى التثبيت

معلومات المصدر

المستودع
vchelaru/FlatRedBall2
آخر نشاط في المصدر
٤ سبتمبر ٢٠٢٦ في ١١:٠٤
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
١٤
التفرعات
٦

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
performance
description
FlatRedBallService.Performance — opt-in rolling FPS/timing/collision stats. Triggers: PerformanceMonitor, GenerateReport, FPS, frame time, DeepCollisionCount, "why is my game slow".
# Performance Monitoring `FlatRedBallService.Default.Performance` (a `PerformanceMonitor`, `src/Diagnostics/PerformanceMonitor.cs`) tracks rolling FPS, per-phase frame timing, and a per-collision-relationship severity breakdown over a 120-frame window. **Off by default** — set `IsEnabled = true` before it records anything; until then every stat reads zero/empty. ```csharp FlatRedBallService.Default.Performance.IsEnabled = true; // later, e.g. every N frames from Screen.CustomActivity: var perf = FlatRedBallService.Default.Performance; Console.WriteLine(perf.GenerateReport()); // FPS + phase timing + collision severity, as a string var fps = perf.Fps; // .Current / .Average / .Min / .Max var worst = perf.GetCollisionReport(); // most expensive first; each row carries a PartitionStatus ``` `GenerateReport()` only builds a string — it does no I/O itself, so printing/logging/writing it is on the caller. ## Timer resolution (web) `GenerateReport()` opens with a `Platform:` line and the measured clock step (`TimerResolutionMs`, probed once via `ProfileClock.MeasureResolutionMs`). **Landmine:** browsers coarsen their clock as a Spectre mitigation — ~1ms on Firefox/Safari, ~0.1ms on Chrome — and `Stopwatch.Frequency` does not reflect it. Whole-pass totals stay accurate (start/end errors cancel), but any per-phase number smaller than one step reads as 0 or one full step and nothing between. The report warns automatically above 0.5ms. Set `PlatformLabel` from the host — the engine targets `net10.0` and cannot read `navigator.userAgent` itself. Every row in the collision report carries a `PartitionStatus`. `Unpartitioned` is the only value worth acting on, and the fix is to set the same `Factory<T>.PartitionAxis` on both sides of the relationship. `NotApplicable` means one side is not a factory, such as a `TileShapes`, a single entity, or a plain `List<T>`, so no axis setting would change it. See the `collision-relationships` skill. See `src/Diagnostics/FrameProfile.cs` for the underlying per-frame timing struct.
عرض على GitHub