ECS Performance Audit
Overview
This skill performs comprehensive performance analysis of Entity Component System implementations in the C#/.NET 10.0 game engine. It identifies bottlenecks, memory allocation issues, and cache coherency problems that impact frame time.
When to Use
Invoke this skill when encountering:
- Frame rate drops related to entity processing
- Slow iteration over large entity collections
- Questions about system execution order optimization
- Memory allocation concerns in hot paths (OnUpdate, rendering)
- Cache coherency issues with component layouts
- Performance regressions after ECS changes
- System initialization or update performance issues
Analysis Process
1. System Iteration Patterns
- Identify systems iterating without proper component filtering
- Check for O(n²) algorithms in entity loops
- Verify LINQ usage doesn't cause unnecessary allocations - always prefer zlinq library
- Look for
GetEntitiesWith<T>()calls in hot paths - Check for unnecessary component lookups (cache component references when possible)
2. Priority & Ordering
- Validate system execution order via
SceneSystemRegistryandSystemManager - Check for implicit update order dependencies
- Verify priority values align with execution requirements:
- ScriptUpdateSystem: Priority 100
- AnimationSystem: Priority 198
- TileMapRenderSystem: Priority 200
- SpriteRenderingSystem, ModelRenderingSystem: Default
- Suggest priority adjustments for better parallelization potential
3. Memory Allocation
- Flag allocations in
OnUpdate(),Render(),OnEvent()loops - Identify boxing, LINQ materializations (
.ToList(),.ToArray()) - Check for closure captures creating heap allocations
- Look for string concatenation in hot paths
- Identify lambda allocations in frequent operations
- Recommend object pooling strategies for frequently created objects
- Suggest
Span<T>andstackallocand Memory<T> where appropriate
4. Data Locality & Cache Coherency
- Evaluate component data layout (prefer value types when small)
- Check for Structure of Arrays vs Array of Structures opportunities
- Suggest cache-friendly component packing
5. Reflection & Dynamic Dispatch
- Flag reflection usage in hot paths (use static caching like
ScriptableEntity) - Check for virtual method calls that could be devirtualized
- Identify dictionary lookups that could use faster alternatives
- Verify factory pattern usage for appropriate caching
6. Profiling Recommendations
- Suggest specific
dotnet-traceor profiler commands - Recommend benchmark scenarios for validation
- Provide before/after measurement guidance
- Reference
Benchmarkproject anddocs/specifications/physics-benchmark-design.md
Output Format
Provide findings in this structure:
Issue: [Clear description of the problem]
Impact: [Performance cost - frame budget impact, allocation rate, cache misses]
Location: [File path with line numbers, e.g., Engine/Scene/Systems/MySystem.cs:42]
Recommendation: [Specific optimization with code example]
Priority: [Critical/High/Medium/Low based on frame time impact]
Example Output
**Issue**: LINQ materialization in OnUpdate() loop
**Impact**: ~5,000 allocations per frame (60fps = 300k/sec), causing GC pressure
**Location**: Engine/Scene/Systems/RenderingSystem.cs:156
**Recommendation**: Replace `.ToList()` with direct iteration:
// Before
foreach (var entity in scene.GetEntitiesWith<SpriteRendererComponent>().ToList())
// After
foreach (var entity in scene.GetEntitiesWith<SpriteRendererComponent>())
**Priority**: High
Scan to join WeChat group