Mine Mage Minion
raylib (C++)  →  Bevy (Rust)  ·  port benchmarks
Wishlist on Steam

Gameplay

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.

On the raylib side I had also 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 none of that class of bug happens anymore.

So I ported the whole thing 1:1 to Bevy (Rust). 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.

Both versions were benchmarked on the same laptop: a GTX 1650 Mobile, Ryzen 5 3550H, 32 GB dual-channel RAM at 2400 MHz. 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.

2.2×
FPS at 1000 enemies
25 → 55
1.5×
FPS at 540 enemies
50 → 74
55 fps
Bevy's worst case
raylib was already at 25
+8.8 MiB
Web download cost
23.1 → 31.9 MiB (zipped)

Frame rate vs. enemy count

Same scene, same machine, enemies spawned in. Higher is better.

Build size per platform

MiB. Lower is better. Bevy web = WebGL2 and WebGPU builds shipped together; Bevy Linux archive is tar.zst, everything else zip.

raylib bevy lighter bar = uncompressed folder