The OOP-to-ECS migration pain is real, but I think the framing of "ECS vs. OOP" misses where the actual value comes from. In my experience, the wins aren't about performance uniformly — they're specifically about cache-coherent iteration over large uniform populations: projectiles, particles, ambient NPCs, loot drops.
Where I've seen ECS actively hurt productivity is complex agent behavior. When an entity needs to coordinate 6–8 systems to produce one logical action, you end up with implicit ordering dependencies between systems that are much harder to reason about than a single update() method. Debugging "why did this enemy do that" turns into chasing data across five separate system files.
The pattern I've settled on: ECS for anything you'll have hundreds of (bullets, debris, crowd NPCs), traditional component objects for anything with complex authored behavior (bosses, puzzle objects, player). Bevy's approach of mixing the two is interesting but I haven't shipped with it yet — would be curious if anyone has thoughts on where that boundary sits in practice with Bevy specifically.
