Gestion de fichier ressources en C++

Le problème exposé dans ce sujet a été résolu.

Salut,

Je cherchais une lib / un utilitaire pour gérer mes fichiers de ressources à la manière de Qt ou VS mais je n’arrive pas à faire de recherche efficace car "ressource" est un mot trop générique.
Me servir de Qt, ne serait-ce que le module Core, me parait overkill et le système de Microsoft ne fonctionne qu’avec des solutions VS et une cible Windows.

Dans l’idée ce serait pour transporter des assets de jeu (même si c’est plus un petit projet sandbox pour m’essayer à des choses), donc ce qui m’intéresse là-dedans c’est :

  • Le chemin d’accès est maitrisé
  • les ressources sont transportées avec l’exécutable donc facilité de déploiement
  • les ressources sont compilées donc cachées à l’utilisateur

Connaissez-vous une lib simple qui se charge uniquement de cela ?

+0 -0

Sauf erreur de ma part, cela pose de problème de tout mettre dans les ressources (question de taille et de chargement). On met dedans des petites icônes ou des petits fichiers, mais pas des assets complets d’un jeu. Donc pas du tout sur que ce soit une bonne idée.

+1 -0

Ok, je comprends, mais ça me parait être une question d’implémentation du système de ressource plus qu’un concept déviant :thinking:

Je pensais que c’était assez courant, je pensais à Binding of Isaac qui fournit au moddeurs l’outil pour extraire les ressources, ou à Godot qui génère des ".tres" pour les assets, mais je ne suis pas encore sur ma tour de jeux pour aller fouiller dans l’arborescence des fichiers du jeu sur un jeu conséquent déjà installé (c’est pas quelque chose que je m’amuse trop à faire, je suis plus joueur qu’hacker)

+0 -0

Salut,

Je rate peut être un truc, mais une façon portable et efficace de distribuer des fichiers avec une application est d’en faire une simple archive… Une fois décompressée, tu as ton arbre de fichiers organisé comme tu veux. C’est comme ça que procède à peu près n’importe quel installateur de jeu, gestionnaire de paquet (l’un des pus simple étant celui de pacman qui ne se fatigue même pas à abstraire tar.xz), système de distribution de librairies et d’applications propre à un langage (les wheels de Python par exemple), etc.

les ressources sont compilées donc cachées à l’utilisateur

Pas compris cette partie. Si tu mets des tonnes de données statiques, ça rend ton exécutable super lourd et lent à charger, tu ne peux pas faire de mises à jours partielles, et en plus ça ne cache pas grand chose à une personne déterminée à fouiller dedans (mais rend la tâche plus difficile pour quelqu’un qui veut juste bidouiller dans son coin). C’est surtout de l’énergie perdue pour tout le monde sans avantage net.

Je ne crois pas que les ressources soit inliné dans les solutions Qt et VS auxquels je faisais référence, mais du coup je pense qu’effectivement ce ne sont simplement que des archives un peu particulière.
Du coup je peux me tourner vers les libs d’archive.

J’ai jeté un oeil dans mes jeux installés et je ne vois les ressources d’aucun d’entre eux directement accessible, j’ai vu des fichiers unity ressources ou d’autres formats, c’est donc le jeu qui les extrait de l’archive au runtime, pas l’installeur ? (pour confirmer)

+0 -0

Bonjour,

Les ressources directement incluses dans l’exécutable, il me semble qu’en plus c’est un concept essentiellement windows. Je n’ai jamais rien vu de ce genre sur mac ou linux.

Donc quoi qu’il en soit, le plus portable et probablement le plus performant aussi est effectivement un fichier d’archive.

Pas besoin de se prendre la tête pour réinventer son propre format. Perso j’utilise la bibliothèque libzip pour lire des archives zip chiffrées, elle est portable et assez facile d’utilisation.

L’avantage c’est qu’en plus on peut packager les ressources indépendament de la compilation du programme. A la main avec un utilitaire comme 7zip ou même automatiquement dans un script qui compile l’installeur. C’est pas négligeable de pouvoir changer des images ou des sons sans devoir tout recompiler.

+0 -0

Les ressources directement incluses dans l’exécutable, il me semble qu’en plus c’est un concept essentiellement windows. Je n’ai jamais rien vu de ce genre sur mac ou linux.

QuentinC

Non, c’est quelque chose qui peut se faire sur linux sans soucis non plus. Une méthode très simple et portable consiste à mettre les données directement dans une variable statique:

static inline constexpr unsigned int data[] = {0, 1, 2, /*...*/, 0x42};

C’est évidemment quelque chose qui peut se faire automatiquement.

Je rejoins les commentaires des autres sur le fait qu’avoir des ressources séparé de l’exécutable rend un certain nombre de trucs plus simple, comme permettre de faire des mise à jour partielle.

Si tu mets des tonnes de données statiques, ça rend ton exécutable super lourd et lent à charger, tu ne peux pas faire de mises à jours partielles

adri1

Les données statiques dans un exécutable ne sont pas forcément une mauvaise chose en terme de temps de chargement ou d’utilisation de ressources. Pour des données chargés par défaut au démarrage du programme, les avoir directement intégré à l’exécutable veut dire ne pas avoir à faire N appels système/accès à disque pour charger tous les fichiers séparés. Ça rend aussi les choses plus simple étant donné qu’il n’y a aucun risque que les donnés soient inaccessible.

+0 -0

Une méthode très simple et portable consiste à mettre les données directement dans une variable statique

Effectivement. Mais ça implique une recompilation pour faire une mise à jour.

Une autre technique qui marche à la fois sous windows et linux (aucune idée pour mac), c’est de concaténer les données à la fin de l’exécutable. C’est de cette façon que certains fichiers auto-extractibles et compilateurs language-to-exe fonctionnent, ou en tout cas ont fonctionné pendant longtemps. ATtention toutefois, certains anti-virus n’aiment pas du tout cette technique…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte