Les fondations : rien à voir, ou presqueFoundations: nothing to see, almost

Premier jalon, et pas un seul bloc à l'écran : un cube orange, deux fenêtres et un serveur. Voici pourquoi j'ai commencé par la tuyauterie.First milestone, and not a single block on screen: an orange cube, two windows and a server. Here is why I started with the plumbing.

Rien à voir dans ce premier billet, ou presque : un cube orange et deux fenêtres. Avant de poser le moindre bloc, j'ai construit ce qui ne se voit pas, la tuyauterie qui relie les joueurs entre eux. Ce premier jalon, « Fondations », n'est que ça. À l'époque, le jeu n'avait d'ailleurs pas encore de nom : on voit son nom de code, SIGNAL, en haut des fenêtres.

Nothing to see in this first post, or almost: an orange cube and two windows. Before placing a single block, I built what you never see, the plumbing that connects players to each other. This first milestone, “Foundations”, is nothing but that. Back then the game did not even have a name yet: its code name, SIGNAL, shows at the top of the windows.

J'ai posé une règle dès le premier jour : même en solo, on joue sur un serveur. Quand on lance une partie seul, le jeu démarre discrètement un vrai serveur sur la machine et s'y connecte, exactement comme il se connecterait à celui d'un ami. Je ne veux pas découvrir, le jour où j'invite quelqu'un, que la moitié du jeu ne marche qu'en solo.

I set one rule on day one: even in solo, you play on a server. When you start a game on your own, it quietly launches a real server on your machine and connects to it, exactly as it would connect to a friend's. I don't want to find out, the day I invite someone over, that half the game only works in solo.

Deux explorateurs connectés au même serveur, au temps où le jeu s'appelait encore SIGNALTwo explorers connected to the same server, back when the game was still called SIGNAL

À côté de la partie locale, il existe désormais un serveur dédié : un petit programme sans fenêtre, à lancer sur n'importe quel PC Windows ou Linux. Au premier lancement, il crée son fichier de configuration (nom du serveur, message d'accueil, nombre de places) et attend les joueurs. Dans l'animation ci-dessous, on voit le journal du serveur défiler en direct, deux explorateurs, Ada puis Bob, le rejoindre, puis Ada s'en aller.

Alongside the local game, there is now a dedicated server: a small windowless program you can run on any Windows or Linux PC. On first launch it creates its config file (server name, welcome message, number of slots) and waits for players. In the animation below, you can watch the server log scroll live, two explorers, Ada then Bob, join it, and then Ada leave.

Le cube orange est provisoire, mais il a un vrai rôle : il tourne au rythme du serveur, pas de votre écran. Sur les deux fenêtres, les cubes tournent donc d'un seul bloc. C'est la preuve visible que les deux joueurs partagent la même horloge. Et quand quelque chose coince, le jeu le dit clairement, en français ou en anglais : serveur plein, pseudo déjà pris, version différente, serveur injoignable.

The orange cube is temporary, but it has a real job: it spins to the server's rhythm, not your screen's. On both windows, the cubes therefore turn in perfect sync. It is visible proof that both players share the same clock. And when something goes wrong, the game says so clearly, in French or in English: server full, name already taken, different version, server unreachable.

La chasse aux millisecondes

Chasing milliseconds

Le serveur avance par « ticks », 20 fois par seconde, et lit les messages reçus au début de chacun. Un ping attend donc en moyenne 25 ms avant d'être traité ; ça, je le savais. Ce que je ne savais pas, c'est ce que les premières mesures allaient me montrer.

The server moves forward in “ticks”, 20 times per second, and reads incoming messages at the start of each one. A ping therefore waits 25 ms on average before being handled; that much I knew. What I didn't know was what the first measurements were about to show me.

D'abord, un ping deux fois plus lent par le réseau que par la mémoire. La bibliothèque réseau gardait ses paquets en attente et ne les expédiait qu'à son propre rythme. Maintenant, le serveur et le client la réveillent à la fin de chaque tick, et le réseau local fait aussi bien que la mémoire. Ensuite, des ticks en retard sous Windows : par défaut, le système ne réveille un programme en attente que toutes les 15 ms environ. Le serveur tenait bien ses 20 ticks par seconde en moyenne, mais chacun partait avec un retard variable. Il demande désormais une horloge plus fine, et ses ticks partent à moins d'une milliseconde près.

First, a ping twice as slow over the network as through memory. The networking library held on to its pending packets and only sent them at its own pace. Now the server and the client nudge it at the end of every tick, and local networking is as fast as memory. Second, late ticks on Windows: by default, the system only wakes a sleeping program every 15 ms or so. The server did keep its 20 ticks per second on average, but each one started late, by a varying amount. It now asks for a finer clock, and its ticks fire within less than a millisecond.

Côté sécurité, le serveur ne fait jamais confiance au client : taille des paquets bornée, données malformées refusées, débit limité, nombre de connexions par adresse plafonné. Et toute une série de tests automatiques tourne sous Windows et Linux à chaque modification.

On the security side, the server never trusts the client: packet size is capped, malformed data is rejected, throughput is limited, and connections per address are capped. And a whole suite of automated tests runs on Windows and Linux on every change.

La page de RADIONAUT →RADIONAUT game page → Tout le journalAll devlogs