Divers en-têtes C/C++ multiplateformes à fichier unique implémentant des bibliothèques autonomes.
bibliothèque | description | dernière version | langue(s) |
---|---|---|---|
mignon_c2 | Routines de détection de collision 2D sur primitives, résultats booléens et/ou génération de collecteurs, test de moulage/balayage de forme, raycasts | 1.10 | C/C++ |
mignon_net | Bibliothèque réseau pour les jeux nécessitant une couche de fiabilité facultative sur UDP avec un système de sécurité intégré | 1.03 | C/C++ |
mignon_carrelé | Chargeur très efficace pour les cartes Tiled exportées au format JSON | 1.07 | C/C++ |
mignon_aseprite | Analyse les fichiers .ase/.aseprite dans une collection de structures compacte et pratique | 1.04 | C/C++ |
mignon_son | Load/play/loop (avec plugin)/pan WAV + OGG (stb_vorbis wrapper pour OGG) en mono/stéréo, mixeur personnalisé hautes performances, support musique + crossfade | 2.08 | C/C++ |
mignon_math | Mathématiques vectorielles 3D de niveau professionnel via les intrinsèques SSE | 1.02 | C++ |
mignon_png | charger/enregistrer PNG, compilateur d'atlas de texture, décompresseur compatible DEFLATE | 1.05 | C/C++ |
mignon_spritebatch | Batcheur de sprites 2D d'exécution. Construit des atlas à la volée en mémoire. Utile pour implémenter un gestionnaire de sprites dans n'importe quel but (comme les jeux 2D) pour un rendu haute performance, sans avoir besoin de précompiler des atlas de textures sur le disque. | 1.06 | C/C++ |
mignon_sync | Collection de primitives de synchronisation pratiques, y compris le verrouillage en lecture/écriture et le système de pool de threads/tâches | 1.01 | C/C++ |
mignon_tls | Créez une connexion TLS à un site Web via TCP, utile pour les requêtes HTTPS. | 1.01 | C/C++/Obj-C |
Généralement, ces en-têtes n'ont pas de dépendances et sont destinés à être inclus directement dans votre source (vérifiez chaque en-tête pour une documentation spécifique en haut du fichier). Chaque en-tête possède un symbole LIBNAME_IMPLEMENTATION ; ajoutez-le à une seule unité de traduction dans votre code et incluez l'en-tête juste après afin de définir les symboles de la bibliothèque. Sinon, incluez simplement l'en-tête comme d'habitude.
Certains en-têtes contiennent également des exemples de code ou des démos. Dans ce référentiel, recherchez simplement les exemples ou dossiers de tests correspondants. Les dossiers d'exemple sont particulièrement utiles pour comprendre comment utiliser un en-tête particulier.
Voici un lien vers le chat Discord pour cute_headers. N'hésitez pas à venir poser des questions, faire des suggestions ou avoir une discussion. Si quelqu'un a utilisé cute_headers, ce serait formidable d'entendre votre expérience ! https://discord.gg/2DFHRmX
Un autre moyen simple de me joindre est sur Twitter @randypgaul.
- Quel est l'intérêt de créer un seul fichier ? Pourquoi y a-t-il des fonctions d'implémentation et statiques dans les en-têtes ?
Inclure ces en-têtes revient à inclure un en-tête normal. Cependant, pour définir l'implémentation, chaque en-tête ressemble à ceci :
// Do this ONCE in a .c/.cpp file
#define LIBNAME_IMPLEMENTATION
#include "libname.h"
// Everywhere else, just include like a typical header
#include "libname.h"
Cela transformera le fichier en un combo en-tête + fichier c, une fois. Le point est le suivant : A) gérer l'en-tête ou l'envoyer à des personnes est facile, pas de fichiers zip ou quoi que ce soit, il suffit de copier et coller un seul fichier ; B) les scripts de construction sont pénibles, et ces bibliothèques à fichier unique peuvent être intégrées dans n'importe quel projet sans modifier un seul script de construction.
- L'écriture de tout le code dans un en-tête ne ruine-t-elle pas les temps de compilation ?
La stigmatisation selon laquelle les implémentations d'en-tête ralentissent le temps de compilation provient du code en ligne et du spam de modèles. Dans les deux cas, chaque unité de traduction doit parcourir l'en-tête et placer des versions en ligne des fonctions, ou pour les modèles, générer diverses fonctions spécifiques au type. La situation empire une fois que l'éditeur de liens entre en jeu et doit fusionner les unités de traduction, supprimant ainsi les symboles en double. Les éditeurs de liens sont souvent des tâches monothread et peuvent vraiment goulotter les temps de construction.
Un en-tête de fichier unique bien construit n'utilisera aucun modèle et utilisera l'inline avec parcimonie. De plus, les en-têtes de fichier unique bien construits utilisent un #define pour placer l'implémentation (les définitions de fonction et les symboles) dans une seule unité de traduction. De cette façon, un en-tête de fichier unique bien conçu est à peu près la meilleure chose qu'un compilateur C puisse trouver, en ce qui concerne les temps de construction. Surtout lorsque l'en-tête peut éventuellement #définir les fonctionnalités inutiles.
- Ces bibliothèques d'en-têtes uniquement ne sont-elles pas simplement une nouvelle mode ?
Personnellement, je ne sais pas vraiment si c'est une mode ou non, mais ces fichiers ne sont pas vraiment de simples en-têtes. Ce sont des en-têtes avec la partie du fichier .C (l'implémentation) attachée à la fin. Il s'agit de deux fichiers différents collés ensemble avec le préprocesseur C, mais la partie implémentation n'apparaît jamais à moins que l'utilisateur ne fasse #define LIB_IMPLEMENTATION. Cette étape de définition est la seule étape d'intégration requise pour utiliser ces en-têtes.
Malheureusement, écrire une bonne bibliothèque d'en-têtes est assez difficile, donc n'importe quelle bibliothèque d'en-tête aléatoire dans la nature n'est probablement pas une bonne bibliothèque. Le STB et le RJM sont de très bonnes bibliothèques d'en-tête et constituent une bonne référence pour avoir une idée de ce à quoi ressemble une bonne bibliothèque d'en-tête. Mattias Gustavsson a ma collection d'en-têtes préférée.
- Qu'est-ce que la licence ?
Chaque bibliothèque contient des informations de licence à la fin du fichier. Il y a le choix entre le domaine public et zlib.
- Je cherchais un en-tête que j'avais déjà vu, mais il manque. Où est-il passé ?
Certains des en-têtes impopulaires ou moins utiles sont devenus obsolètes et sont désormais disponibles ici.
- *Avez-vous des bibliothèques de niveau supérieur ? Ceux-ci semblent un peu trop bas.
Les jolis en-têtes sont en effet plutôt bas de gamme. Ils résolvent des problèmes spécifiques. Si vous recherchez un cadre de création de jeux de niveau supérieur, je vous suggère d'essayer Cute Framework, un cadre de création de jeux 2D construit en grande partie sur les différents en-têtes mignons de bas niveau vus ici.