Gun Trails - a bullet hell shooter [3/16 Update: Trailer, Notes from Lua->C Port, Screenshots added]

Starting to share bits and pieces of my game, Gun Trails

will write up more tech details later; but a quick summary

  • runs (easily) at 50hz on device, limited by the systems full-redraw limit
  • written in C99, no external libraries, outside of the playdate SDK used
  • within the SDK, most things are not used(sprites, collision etc), in favor of a faster, hand rolled implementation

more stuff

feel free to ask questions


edit: the game has evolved since this original post, I now plan to release it paid on catalog and/or


some fun background experiments

here is a slowed down gif as well (I didnt slow it down on purpose, I just dont know how to use ffmpeg right lol)


Great art! Definitely doesn't look like something that ought to be free!


playing with some menu transitions

(re-upload as ffmpeg smites me for my hubris)



boss sneak peek


a lil sneak peak of the music


got some love from a publication today: This Tiny New Playdate Shmup Looks Incredibly Stylish | Time Extension

pretty neat! as far as the release date goes, I hope its within the next month, but I can't promise,

1 Like

preview of one of three phases for boss #1

:bangbang: keep an eye out for the trailer coming out this week on !!!!

1 Like

trailer: Playdate's Newest Trend: Everything You Need to Know | Playdate News - YouTube


Yeah, things have evolved a bit over the last few months, and after talking with Panic and some other people I plan to release it for a fee on itch and possibly catalog.

1 Like

This is a bit old, but I forgot to share about the port from Lua to C a few months ago. May be of use to others when making evaluations.

Rarely have I had the time for an apples-to-apples port. This was going from well optimized Lua

  • Running at ~49fps
  • Lua specific optimizations (consts, avoiding global lookups etc)
  • Access pattern oriented data layout
  • Custom collision detection (faster than the provided AABB)
  • Zero runtime user allocation (all memory managed internally, notice flat memory line and constant GC %))

That said, I was hitting the ceiling, and I still had a few more features I was hoping to cram in, so I did a direct port to C99 (I wasn’t using any fancy metatable stuff in lua, just records, arrays, and functions, so it really was as 1-1 as it could be).

This is just one codebase, one data point, so evaluate accordingly. That said, this will hopefully serve as a useful data point for the kind of possible gains wrt porting.

cc @matt may be useful for your perf write-ups/book

edit: for those curious about the memory usage difference, this is because, in Lua, fundamental types are all 4 bytes in Lua, whereas in C, appropriately sized types can be used (uint8_t, int16_t for example)

this memory usage has a impact on cpu performance as well, smaller data => more data per cacheline => faster computation


Wonderful, thanks for sharing.

I guess full screen height update limits you to 49/50. I wonder how high you'd be able to go without the screen bottleneck?

1 Like

On the current build, I'm floating at 65-75% CPU at ~49.5fps (slight tick up in recent SDK update), so I figure current frame time is about ~15ms, so it could possibly go ~65fps if the limiting factor was removed. Worth noting the version I'm speaking on here has had its featureset grown significantly since the referenced image, so not 1-1 with those two graphs).

1 Like

cc @willco on this one

data may be useful when providing guidance to devs wrt Lua/C, since (afaik) havent been any documented 1-1 ports

1 Like

Out of interest, what were you able to change in your custom implementations that was so much faster than the default SDK versions?

1 Like

heh, probably not something I could fit in a single post. i'll try to do a longer write up of this some time after launch.