dimanche 16 novembre 2025

KSA, mon chaton dans l'espace (et sous Linux, s'il vous plait !)

Enfin, après des mois d'attente, une version jouable de Kitten Spage Agency (KSA), qui se veut le digne successeur de Kerbal Space Program (KSP), est maintenant disponible, et il a fallu que je l'essaie immédiatement. On s'inscrit, on fait optionellement un petit don pour soutenir les devs, et on télécharge l'installeur.

Même si une version Linux est prévue pour bientôt, il s'agit d'un installeur Windows. Heureusement, cela fonctionne sous Wine / Proton, à condition de bidouiller un petit peu - Cette vidéo par exemple nous prend suffisamment par la main pour le faire fonctionner.

Et ça marche ! Alors, avec ma config antédiluvienne, je tourne à 5 images par seconde, et j'ai de plus quelques bugs graphiques, mais techniquement ça tourne. J'ai hâte de suivre les progrès de l'équipe, et de mettre à jour mon matos pour pouvoir pleinement en profiter. Vivement la suite !

jeudi 13 novembre 2025

Steam Frame - L'annonce

Enfin, des informations ! Steam a annoncé aujourd'hui son nouveau matériel: la manette, la Steam Machine, qui est un mini-PC sous SteamOS qui veut se faire passer pour une console (ce qui est exactement mon projet de cet hiver par ailleurs), et le Steam Frame, qui est le nouveau casque de réalité virtuelle autonome, accompagné de ses contrôleurs.

Passé la déception d'avoir à attendre jusqu'à 2026 pour poser mes mains sur le Steam Frame, c'est la joie de comprendre que Valve a l'intention de fournir exactement ce que je voulais : un casque autonome (pour les jeux arcade), mais qui peut faire de l'affichage déporté depuis un PC (pour les jeux plus gourmands), avec une connection sans fil de haute qualité via un adaptateur, le tout parfaitement compatible avec Linux.

Ma patience va être mise à rude épreuve !

mardi 4 novembre 2025

Rêves de rouille

Je m'intéresse, de loin, à Rust - Puisque c'est apparemment le futur de la programmation système ! Même si de nombreux aspects me poussent à m'interroger, en particulier la Pythonification avec la démultiplication de minuscules bibliothèques qui sont tellement faciles à tirer via le gestionnaire de paquets et finissent par créer un bazar infâme - Mais je ne demande qu'à être convaincu. Je vais donc tenter de m'y mettre doucement. Parmi les possibles, j'entrevois un bon vieux raytracer : c'est amusant, ça peut être très simple, et l'on peut itérer pratiquement indéfiniment à rajouter des fonctionnalités. On va donc devoir tirer la "crate" image, quelque chose pour gérer la géométrie en 3D (à moins de la réécrire), et apprendre à faire des tests unitaires. Ah, et bien sûr, l'intégration avec Emacs, sans quoi je suis perdu. Et on verra bien !

mardi 30 septembre 2025

Divisions entières rapides

Je me suis attaqué à un morceau plutôt amusant : en effet, j'ai eu besoin d'écrire ma propre queue circulaire à accès concurrent, avec un producteur et un consommateur - Typiquement le genre de problème que l'on désire résoudre avec un algo "lock-free". Ce n'est pas très compliqué : un atomic pour l'écriture, un atomic pour la lecture, et basta. Là où ça devient intéressant, c'est dans les différentes optimisations sur lesquelles on peut travailler.

Tout d'abord, bien penser à séparer ses atomiques, afin d'éviter le "false sharing", c'est à dire le transfer entre les caches CPUs de données qui sont indépendantes, mais proches. On utilise pour cela alignas(std::hardware_destructive_interference_size) devant nos attributs afin de bien les séparer.

Ensuite, on se rend compte que l'on a besoin à chaque lecture ou à chaque écriture de vérifier si l'on a atteint la fin du tampon circulaire pour repartir à zéro. Cela peut se faire soit avec un test, soit avec un modulo. Les deux sont plutôt chers... Heureusement, si l'on est pas trop regardant sur la taille exacte de son tampon, on peut l'arrondir à la puissance de 2 suivante, ce qui simplifie énormément les calculs : en effet, le modulo n'est alors qu'un masque...

Voici la partie intéressante du code, qui utilise std::bit_ceil pour trouver la prochaine puissance de 2, calcule le masque, et effectue l'incrément et la division modulaire

class Buffer
{
public:
    Buffer(size_t length):
        _size(std::bit_ceil(length)),
        _mask(_size - 1),
        _reader(0),
        _writer(0)
    {
    }

    void nextRead()
    {
        _reader = (_reader + 1) | _mask;
    }

    const size_t _size;
    const size_t _mask;
    alignas(std::hardware_destructive_interference_size)
    std::atomic _reader;
    alignas(std::hardware_destructive_interference_size)
    std::atomic _writer;
};

Mais la plus grande optimisation que l'on peut faire est de correctement effectuer l'ordonnancement de la mémoire, en sélectionnant memory_order_relaxed, memory_order_acquire ou memory_order_release lors des appels à store et load. La différence est très impressionnante - Un facteur 10 ou 20 dans certains benchmarks ! Je vous passe la logique exacte (en très gros, on load en memory_order_acquire, on store en memory_order_release, et pour des cas indépendants comme chercher la taille du tampon, on peut utiliser memory_order_relaxed), mais en permettant la réécriture des opérations de manière plus flexible que l'accès strict par défaut, le compilo est capable d'effectuer de très bonnes micro-optimisations, et cela se voit !

dimanche 3 août 2025

Oh la jolie maison !

De mes vacances en Crète, je retiens tout pleins de trucs (en particulier, je me suis senti complètement dans Subnautica à chaque fois que je sautais dans l'eau !). Mais voilà quelque chose qui m'a beaucoup plu : cette jolie maquette en terre cuite de maison, dans le plus pur style Assassin's creed - Odyssey, et qui trône au musée archéologique de la Canée. Maintenant, j'ai très envie de la modéliser !

lundi 21 juillet 2025

Inside - Un jeu de platforme / réflexion glauquissime

J'avais regardé un let's play de Inside il y a de cela quelques temps, pensant que je n'aurais jamais l'occasion d'y jouer, et puis il était sur le Game Pass et j'avais un peu de temps, alors je m'y suis mis. Quel beau jeu ! Quel jeu assez terrifiant aussi, avec ce petit garçon pourchassé par des hommes, des chiens et des machines, qui doit tenter de survivre dans un monde post-apocalyptique où la plupart des êtres humains semblent être devenus des automates décérébrés au service de quelques uns. Il y a des plates formes, des puzzles pas trop méchants, des parties sous l'eau très angoissantes, des machines étrages, et une ambiance très sombre. La difficulté est très mesurée, et je n'ai jamais été coincé bien longtemps - C'est surtout l'atmosphère glauque et l'impression de danger permanent (ah, la sirène !) qui rendent l'expérience de jeu tout à fait inoubliable.

lundi 9 juin 2025

The Ascent - Un cyber punk bourrin

En cherchant un nouveau jeu multijoueurs et crossplay pour retrouver un peu les sensations de Diablo 4, je suis tombé sur The Ascent, qui avait de plus la bonne idée d'être en soldes. Dans ce hack n slash cyberpunk, on incarne un gros bras d'un parrain local et qui nous envoie tirer sur tout ce qui bouge dans diverses missions qui nous emmènent aux 4 coins de la ville.

Le monde est immense et alterne entre les zones commerciales, plutôt sûres, et où l'on peut améliorer ses armes et ses divers implants, et de grandes zones industrielles à moitié en ruines où l'on se fait attaquer par de l'humain et par de l'extra-terrestre à chaque pas. Il faudra choisir la bonne arme, se mettre à couvert, et esquiver au bon moment pour survivre aux hordes d'ennemis, ainsi qu'aux boss particulièrement puissants. L'intrigue est parfois maigrelette, mais un codex se remplit au fur et à mesure pour ceux qui veulent du contexte. Le jeu est très beau, les effets de lumière dans cette ville crépusculaire sont magnifiques. L'on notera quelques bugs et quelques crashs, mais rien qui n'empêche de bien rigoler entre potes à tout défoncer.