samedi 9 mars 2024

C++ : Chercher un fichier dans un répertoire - Partie 2

Et on continue à creuser ! Malheureusement, même avec une recherche récursive écrite en libc, cela prend encore trop de temps sur le système cible. En effet, il s'agit d'un système de fichiers un peu particulier, qui est censé monter en charge très fort mais dont les accès aux métadonnées sont individuellement plutôt lents. Et je ne peux pas échapper au besoin de devoir indexer un système de répertoires contenant environ 100 000 fichiers.

Le système de fichiers veut un accès concurrent ? On va lui en donner un. Malheureusement, ce n'est pas si simple ! En effet, il faut créer un algorithme à la fois récursif et parallèle, ce qui est un nid à problèmes. Pour l'instant, j'entrevois une solution qui consisterait à construire une liste des répertoires non visités, les visiter de manière parallèle pour aller chercher à chaque fois le prochain niveau, et continuer tant qu'on trouve. Le fait de gérer les tâches à partir du thread principal simpilife beaucoup de choses, mais empêche un très bon parallelisme.

Quelle tuile.

mercredi 21 février 2024

C++ : Chercher un fichier dans un répertoire

Petite séance d'optimisation aujourd'hui, où nous tentions d'améliorer une routine qui cherche des fichiers dans un répertoire.

En bon dev C++, nous sommes allés chercher ce bon vieux std::filesystem::path et ce non moins bon vieux std::filesystem::recursive_directory_iterator. Sauf que ça prend des plombes. Mais vraiment. Sur un système de fichiers distant (NFS) et un répertoire de 5000 fichiers pas accédé depuis quelques temps, cela peut monter à des dizaines de secondes. Mais que se passe-t-il ?

Avant de se lancer dans de complexes manipulations avec vtune ou encore gprof, pstack nous indique que l'on passe beaucoup de temps dans l'appel à stat. En effet, std::filesystem::recursive_directory_iterator nous donne un std::filesystem::directory_entry qui contient tout un tas d'infos tout à fait intéressantes, mais qui sont chères à récupérer...

Alors que peut-on faire ?

Eh bien, revenir aux bases, et à cette bonne vieille libc, qui contient l'appel readdir, lequel justement ne récupère pas d'informations sur le fichier autre que son type (ce qui est pratique pour explorer récursivement un répertoire). Et n'oublions pas non plus glob, lequel est justement conçu pour aller chercher un fichier efficacement à partir d'un motif.

Testons, alors. Et sur notre répertoire de 5000 fichiers, cela donne maintenant:

filesystem 40s
readdir 30ms
glob 3ms

Glob est donc plus de 10000 fois plus rapide qu'une recherche manuelle !

Conclusion : méfiance, donc ! Malgré ses qualités, std::filesystem::path peut coûter très cher, et revenir à des appels plus bas niveau est parfois salutaire.

vendredi 9 février 2024

Unity3D

Je m'initie aux joies d'Unity3D, et je trouve l'outil particulièrement bien fichu. Le fait qu'il soit aisé de trouver tout un tas de docs et de tutoriels vidéos aide aussi, bien sûr. Histoire de tenter de comprendre le bousin, j'ai modélisé une voiture, puis je l'ai importée et utilisé le moteur physique pour la faire se déplacer. Grâce au modèle de roue très complet comprenant les amortisseurs et la puissance, il suffit d'un petit peu de plomberie pour faire quelque chose de plutôt impressionnant.

Voici donc une sorte de jeep, ainsi qu'une boule que j'ai utilisée pour m'entraîner à importer des matériaux complexes depuis Blender. Et que ça marche bien ! Prochaine étape : ajouter obstacles et plans inclinés pour faire bondir la bagnole.

mardi 23 janvier 2024

X-Plane en stream sur la télé

Eh bien ça marche ! Je ne sais pas trop ce qui a fait la différence, mais avec un Raspberry Pi réinstallé de neuf, et une reconfiguration complète des options dans Steam Remote, j'ai un X-Plane stable (une fois le chargement complété, j'ai quand même eu 2 déconnexions avant). Les commandes au pad sont moins chiadées qu'avec le hotas, mais sur grand écran, c'est très, très agréable. Je m'en suis mis plein les yeux.

dimanche 21 janvier 2024

Steam remote et Raspberry Pi

Ayant découvert la fonctionnalité "Remote Play" de Steam, je tente de bidouiller pour le faire fonctionner depuis ma tour jusqu'à ma télé avec un Raspberry Pi. Et le résultat est, heu, particulier.

Tout d'abord, c'est déjà hyper impressionnant que ça fonctionne tout court, et sans trop se casser le bol : la partie serveur de Steam Remote fonctionne toute seule, et le steamplay sur Raspberry Pi s'installe très facilement. Une fois qu'on a compris qu'il fallait faire un Ctrl-Alt-F1 pour aller dans le framebuffer et démarrer le client depuis là, c'est plutôt tranquille. Ensuite, le serveur est détecté, les périphériques aussi, bref, magie.

Cependentant, j'ai encore 1 souci : autant sur le même switch, la connection est tout à fait stable, en passant par le deuxième switch près de la télé, j'ai des coupures toutes les 3 minutes : le client quitte brutalement la session, et je dois me reconnecter.

Alors, que se passe-t-il ? La seule idée que j'ai, c'est que le switch de la télé est en 1Gb/s, alors que le switch près de la tour est en 100Mb/s. Est-ce que ça cause des pertes sur certains types de paquet ? Peut-être de l'UDP ?

Au vu du prix des switchs de nos jours, j'ai bien envie de simplement mettre à jour mon antiquité (25 ans d'âge tout de même !) et voir ce que ça donne.

Bonne année !

Permettez moi de souhaiter à mes nombreux lecteurs une excellente année 2024 !

dimanche 17 décembre 2023

Pentiment

Que voici une belle claque vidéoludique. J'avais vu passer Pentiment sur CanardPC, et je l'avais gardé dans un coin de ma mémoire, jusqu'à ce que je voie qu'il était disponible sur le XBox GamePass. Ni une, ni deux, je l'installe, je l'essaie, et je suis scotché.

Pentiment est un jeu d'enquête qui se passe dans un village de Bavière au XVIème siècle, dans lequel on incarne l'artiste Andreas, qui se retrouve malgré lui au milieu d'une affaire criminelle qu'il devra tenter de résoudre.

Tout d'abord, c'est graphiquement que c'est magnifique. Un jeu entier dans le style des enluminures du Moyen-Âge, avec exploration d'une abbaye, d'un village, de ruines romaines, le tout entrecoupé de séquences oniriques plutôt émouvantes, ça fait quelque chose. Ensuite, l'histoire est prenante : il y a le mystère, la vie difficile des différents protagonistes, et et l'impression constante que l'on est en train de faire des erreurs et de condamner des innocents. Cet impact constant sur l'histoire est ce qui fait le charme du jeu : l'on doit en permanence faire des choix qui vont changer, pour le meilleur et pour le pire, le destin des habitants du lieu. C'est aussi assez frustrant lorsque l'on a l'impression de rater étape après étape, mais cela fait partie du jeu : il n'est pas possible de reprendre à un point précédent de l'histoire, et nous sommes donc condamnés à vivre avec les conséquences de nos décisions.

Il y a probablement un potentiel de rejouabilité, pour découvrir tous les chemins possibles, tenter de sauver un personnage et d'en condamner un autre, ou explorer certaines scènes que l'on a raté. En effet, limité par le temps, il n'est juste pas possible de tout voir en une seule partie. Cependant, il y aura nécessairement des redondances, et pour ma part, une seule session sera suffisante !