Why I changed the engine
Mine Mage Minion started life as a hand-rolled C++ game on top of raylib. It worked, but the frame rate fell off a cliff the moment the screen filled with enemies, which is exactly what a wave-survival game is supposed to do.
To be clear, that's on me, not on raylib. raylib is a solid, well-built library, it's just a thin layer close to the metal, so it hands you the wheel on things like your ECS and memory management instead of doing it for you. On the raylib side I had hand-rolled my own ECS, and I just wasn't good enough at it. It kept producing undefined behavior: weird bugs that only showed up at runtime, memory management issues I didn't fully understand, hours lost chasing crashes with no clear cause. Bevy's ECS is battle-tested and handles that for me out of the box, so that whole class of bug doesn't happen anymore, but a raylib dev who actually knows what they're doing wouldn't have run into most of this in the first place.
So I ported the whole thing 1:1 to Bevy 0.19 (Rust), coming from raylib 6.0 (C++). Same game, same systems, same content, different engine. This page is the honest before/after: frame rate under enemy load, and how big the builds ended up on each platform.
Short version: raylib wins on an empty map and on download size. Bevy wins everywhere that actually matters once the game gets busy, 2.2× the frame rate at 1000 enemies, and it stops falling apart where raylib drops below 30, though a more experienced raylib dev could likely close a lot of that gap.
Both versions were benchmarked on the same laptop: a GTX 1650 Mobile, Ryzen 5 3550H, 32 GB dual-channel RAM at 2400 MHz, running CachyOS Linux. Take the exact numbers with a grain of salt, I'm not that good at optimizing either engine, so these could shift by 10–15 fps with better tuning on either side. The overall shape of the comparison should still hold.