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.

samedi 24 mai 2025

Unravelled Two - Un bon casse-tête plateforme pour jouer ensemble

Cela faisait un petit moment que j'avais repéré Unravelled Two dans le Game Pass, et en cherchant le prochain jeu pour jouer avec les enfants, on a décidé de s'y mettre. Comme dans beaucoup de jeux du genre, c'est tout d'abord un principe, celui de deux personnages faits de cordes, attachés l'un à l'autre, et qui peuvent utiliser la corde pour s'accrocher à certains emplacements, et se tirer l'un l'autre des plateformes. Ce principe est ensuite décliné dans tout un tas de tableaux où l'on doit s'entre aider pour passer les obstacles.

Une petite histoire et des décors très variés, forêt, parc, maison, entrepôt, complètent l'expérience de jeu. Le multijoueurs est optionel : si l'on joue seul, l'on doit passer d'un personnage à l'autre avec un bouton. Il est possible de combiner les deux personnages en un seul afin de ne pas avoir à répéter les passages de plateforme 2 fois. Ce mécanisme, toujours présent en multi, fonctionne particulièrement bien lorsque l'on joue avec un jeune enfant : on a le temps de l'aider ou de lui donner des indications sur où se tenir et où attraper le fil, tandis que le joueur le plus expérimenté du duo peut s'occuper des parties où il faut synchroniser ses sauts ou encore certaines parties plateforme un peu plus compliquées.

Ajoutons à ceci que l'ambiance, même un peu inquiétante, reste bon enfant, et que chaque tableau est assez court et permet donc de s'arrêter à peu près n'importe quand, et l'on a un petit jeu casual tout à fait sympathique.

mardi 6 mai 2025

Paleopine - Un jeu casual bien fichu, mais non exempt de quelques défauts

Connaissiez-vous Paleopine ? De nos jours, avec l'explosion de l'offre, il n'est pas difficile de rater des jeux plutôt bien notés et servis par de grosses communautés, et Paleopine, sorte de mix entre Ark Survival Evolved et Stardew Valley (si, si !), à la sauce hyper-casu. Du premier, il prend l'idée des dinosaures à apprivoiser qui possèdent diverses capacités, et du second, l'inévitable gestion de ferme, mais avec une rotation des plantations qui n'est pas inintéressante. Le tout est servi dans une sauce hyper gentillette avec zéro violence (les dinosaures même les plus féroces n'attaquent pas et se contentent de fuir) et des graphismes mignons.

L'on retrouve l'inévitable village avec ses habitants qui distribuent des quêtes comme s'il en pleuvait, de nouvelles zones à débloquer et à découvrir, et de nombreux dinosaures à apprivoiser à l'aide d'un mini-jeu à base de flute et de dosage de nourriture.

L'ensemble est sympathique, et ravira les plus jeunes. Cependant, une certaine lassitude s'installe : beaucoup de grind au niveau des plantations, beaucoup d'aller-retours à travers les zones pour aller chercher telle chose ou trouver tel personnage, et des quêtes qui consistent à trouver tout un tas de trucs minuscules disséminés un peu partout sur la carte. Enfin, les contrôles ne sont vraiment pas terribles : planter ses graines, ou encore labourer son champ avec un dinosaure, sont très imprécis et forcent à ajuster en permanence de manière assez peu naturelle et en tapant souvent dans la case d'à côté.

Sympathique, donc - Mais au bout d'un moment, on passera à autre chose sans jamais y revenir.

jeudi 27 mars 2025

Un chateau de sable

Petit retour à Blender, et tentative de suivre ce tutoriel sur comment faire un chateau de sable. Tout plein d'astuces très intéressantes sur les noeuds de géométrie et les shaders. Voici mon rendu :

Le rendu par Eevee en temps réel est terriblement impressionnant : ça fait tout drôle de bidouiller une scène complètement rendue, plutôt que de travailler avec les géométries grises et de lancer un (long) rendu de temps en temps pour avoir une idée du résultat final.