Hi everyone!
For a while I’ve been working on a game built with Julia called Rocket Plumber! Some of you might have seen it already on this other thread where @sylvaticus found the game in the wild, but given I just published a big release (v0.1.0) I wanted to create a post for a proper introduction.

Rocket Plumber is a spaceship and rocket engine building game! At its core is an in-depth fluid network simulation based on electrical circuit solving maths. Pressures, flows, and even the layout of your pipes and components affect how your engines behave. You play in “Explorer Mode”, where you fire your engines to perform manoeuvres in space and encounter randomly generated ships. You must salvage parts and fuel from these ships to keep yourself moving, and the further and faster you go the better parts and fuel you will find. Eventually you will build up a ship powerful enough to perform the massive burn required to ‘escape the galaxy’ and win the game!
I have started a development blog to cover my progress. If you are interested in the circuit simulation stuff check out “RPB#1: Fluid Simulation with Circuits?”, and if you want some more detail on the gameplay take a look at “RPB#2: The Gameplay of Rocket Plumber!”.
As of v0.1.0 Rocket Plumber has moved from just a tech-demo to an early but playable game with a few hours of satisfying learning and progression. It’s far from finished and has some rough edges, but I hope it might be enough to give you a taste of where the game is heading! If you are after a polished game and early access is not your thing, I’d still hold off. But if Rocket Plumber sounds interesting to you, then download it and have a crack. I’m keen to hear what you all think!
- Check out the game’s source on GitHub!
- Download stand-alone executables for Windows and Linux! (I’ve created these with JuliaC, and I’d like to see how portable they are)
- And if you want to stay up to date on releases and the dev-blog, sign up for the mailing list!

Some thoughts on developing with Julia
Given this is a Julia crowd, I figured I’d talk a little about my experiences using Julia for game development which is a somewhat atypical use-case (although less so now, there’s even a commercial game being worked on!).
As for why I chose Julia for this game, I was already using it for technical work as a sort of MATLAB replacement. The game started more as an experiment for that whole fluid-simulation-with-circuit-maths thing, which mostly boils down to linear algebra under the hood. Julia seemed like a great fit for that, so that’s what I used. In the end that hardcore simulation stuff has made up a surprisingly small part of the codebase, once you try and make a game out of it. Julia did also have all the pieces I needed including rendering stuff like GLFW.jl and ModernGL.jl, and given I was building this for fun and to learn I wasn’t particularly interested in an established game engine like Unity anyway. Overall, Julia is just a language I enjoy using so I kept with it.
This has been my first major project with Julia and I’m no expert, so take what I say with a grain of salt. But anyway here are a few things I want to provide my 2 cents on:
Creating portable executable bundles with JuliaC
Of course for a game I can’t expect everyone to install Julia and clone my repo to play, so I need compiled executables. I’ve previously used PackageCompiler for this, and now I’ve recently switched over to JuliaC. I’ve set up a GitHub Actions workflow for the builds, making it easy to get Windows and Linux builds in one go. For RocketPlumber that does require 32GB actions runners as the compilation process has a surprisingly high memory usage. After interacting with some pretty gnarly CMake build systems before, JuliaC doesn’t look half bad in my opinion, and I don’t think distribution needs to be considered a major blocker for Julia’s use in game development.
I’m not actually using --trim at the moment. Trim gets a lot of attention as it’s pretty cool, but I think it’s worth remembering JuliaC works just fine without trimming and you don’t have to make your project trim compatible to distribute it. Of course that means your builds are kind of large. My builds are about 1.3GB on disk, and can be compressed to a 360MB odd zip file for download. That would be pretty bad for something simple like a command line tool, but in the world of 100 plus GB games I don’t see it as that big an issue. For games I actually think having a full fledged Julia environment around could be quite a powerful feature if you think about modding support.
A few other small packaging thoughts.
- I think the RelocatableFolders.jl package is awesome and I highly recommend using it if you need to get lots of small files like sprites and shaders into your compiled package.
- Set up PrecompileTools.jl workloads for your package if you are going to compile it. Even just with a handful of these at the top level of your project you can get a massive amount of your code compiled ahead of time. It makes the compiled builds feel really snappy!
Garbage Collection and GC stutters
One thing you need to really think about if you are making games in Julia is garbage collection and allocations. The overall GC overhead isn’t really a problem, but the GC pauses can be really noticeable for the player as hitches and stutters in the gameplay. I made this worse for myself in Rocket Plumber, as all the particle effects make it really noticeable when this occurs.
I wouldn’t recommend trying to write all your code to be non-allocating. In my opinion you lose a lot of the implementation speed and dynamism, that makes Julia nice to use, and a large portion of your code probably hardly ever runs and doesn’t actually contribute much to your overall allocations. My approach has been to instrument my code with TimerOutputs.jl, and use that to track what parts of my code are allocating. It even gives you percentages, it’s almost like a weighted priority list of where to spend your optimisation time! Every now and then I go on an optimisation spree. Most of the fixes aren’t usually that complicated, eliminate dynamic dispatch in a hot loop here, reuse a buffer there. My last one of these optimisation sprees included some more involved work with my data structures, but I was able to reduce the total allocations by over 90%! At some point I plan to write up a dev-blog post about that. I don’t think GC should be considered an insurmountable blocker to Julia’s use in game development, just something to be aware of!
Thanks for reading! If you do end up trying Rocket Plumber there is a feedback email in the game, so let me know what you think! Rocket Plumber is still a work in progress, and I’m keen to get some player thoughts and productive criticisms I can use to guide my future work!