Show HN: Server-rendered multiplayer games with Lua (no client code)
85 points| brunovcosta | 1 month ago |cleoselene.com
In short, it’s a way to build multiplayer games with no client-side game logic. Everything is rendered on the server, and the game itself is written as simple Lua scripts.
I built this to explore a few gamedev ideas I’ve been thinking about while working on Abstra: - Writing multiplayer games as if they were single-player (no client/server complexity) - Streaming game primitives instead of pixels, which should be much lighter - Server-side rendering makes cheating basically impossible - Game secrets never leave the server
This isn’t meant to be a commercial project — it’s just for fun and experimentation for now.
If you want to try it out, grab a few friends and play here: https://cleoselene.com/astro-maze/
kibbi|1 month ago
When playing astro‑maze, the delay is noticeable, and in a 2D action game such delays are especially apparent. Games that don’t rely on tight real‑time input might perform better. (I'm connecting from Europe, though.)
If you add support for drawing from images (such as spritesheets or tilesheets) in the future, and the client stores those images and sounds locally, the entire screen could be drawn from these assets, so no pixel data would need to be transferred, only commands like "draw tile 56 at position (x, y)."
(By the way, opening abstra.io in a German-language browser leads to https://www.abstra.io/deundefined which shows a 404 error.)
brunovcosta|1 month ago
I think this is inevitable unless I add some optimism/interpolation in the client
Also, thanks for the feedback! I will fix the Abstra landing page
try https://www.abstra.io/en instead
fionic|1 month ago
brunovcosta|1 month ago
My approach lives in some place between video streaming and data streaming in terms of performance
It's not intended to be faster than a proper client that brings a lot of logic and information that diminish the amount of information required to be transfered
My proof of concept is more about: Can my dev exp be much better without relying on the video streaming approach? (which is havier)
ghxst|1 month ago
brunovcosta|1 month ago
Matheus28|1 month ago
This method of multiplayer you propose is inferior in basically every way: you can't do client-side prediction to make inputs feel smoother, and non-trivial scenes will surely take up more bandwidth than just transmitting entity deltas.
Thaxll|1 month ago
Let me tell you that there is cheating in cloud rendering solution ( Stadia, AWS Luna ect ... )
So 100% there is cheating in your solution.
It's trivial to read the screen.
brunovcosta|1 month ago
Especially with today's computer vision
The cheating I'm more protected (just as stadia, etc..) is regarded to client/code exploitation
which we don't have to worry about in this approach
allthatineed|1 month ago
Sprite sheets are png with ztxt blocks with meta/frame info and a list of drawing operations to be done to construct vsprites based on any runtime server side operations done on the sprites.
There is limited client coding via popup Web view windows and a few js apis back to the client but nothing you can build too much off of.
(SS14 brings this model to an open source c# framework called The Robust Engine but has some limitations related to maintainer power tripping over who should be allowed to use their open source project.)
brunovcosta|1 month ago
Thank you for the reference!
aetherspawn|1 month ago
It was playable.
I wonder if you can use speculative execution to play the game a few frames ahead and then the client picks what to display based on user input, or something like that.
Each frame is 16ms, so you’d have to work ahead 6 frames to conquer the nominal latency of around 100ms, which may actually be 200ms round trip.
(In that case, something like Haskell would be a good candidate to build a DSL to build the decision tree to send to the JS client…)
lurkshark|1 month ago
https://bymuno.com/post/rollback
Neywiny|1 month ago
modinfo|1 month ago
https://github.com/skorotkiewicz/proximity-explorer
brunovcosta|1 month ago
I will definitively follow that!
efilife|1 month ago
RodgerTheGreat|1 month ago
6r17|1 month ago
nkrisc|1 month ago
If someone makes an AI that plays the game as a good player, then it’s effectively indistinguishable from a real player who is good. If they make it super-humanly good, then it would probably be detectable anyway.
It’s still fair in the sense that all players have the same (intended) information per the game rules.
tnelsond4|1 month ago
brunovcosta|1 month ago
I'm using Gzip since it comes with all browsers hence a easy approach
That said, I will find som zstd decompressor for js/wasm and try!
edit:
I just added and the difference was huge! Thank you!
2001zhaozhao|1 month ago
This doesn't work in 3D. Unless you have the server do the work of the GPU and compute occlusion, you'll end up sending data to the client that they shouldn't be able to have (e.g. location of players and other objects behind walls)
nkrisc|1 month ago
Don’t some competitive games more or less already do this? Not sending player A’s position to player B if the server determines player A is occluded from player B?
I seem to recall a blog post about Apex Legenda dealing with the issue of “leaker’s advantage” due to this type of culling, unless I’m just totally misremembering the subject.
Regardless, seems like it would work just fine even in 3D for the types of games where everyone has the same view more or less.
cmrdporcupine|1 month ago
This is cool ... but I suspect just pushing video frames like Stadia etc did is just as efficient these days and a lot less complicated to implement and no special client really needed. Decent compression, and hardware decode on almost every machine, hardware encode possible on the server side, and excellent browser support.
MarsIronPI|1 month ago
ftgffsdddr|1 month ago
efilife|1 month ago
emmelaich|1 month ago
brunovcosta|1 month ago
I'm always biased since I test locally with no delay when developing :)
chasebrignac|1 month ago
ycombinatrix|1 month ago
brunovcosta|1 month ago
ingen0s|1 month ago
unknown|1 month ago
[deleted]
duduzeta|1 month ago
brunovcosta|1 month ago
bschmidt25002|1 month ago
[deleted]