Verschiedene plattformübergreifende C/C++-Header für einzelne Dateien, die eigenständige Bibliotheken implementieren.
Bibliothek | Beschreibung | neueste Version | Sprache(n) |
---|---|---|---|
niedlich_c2 | 2D-Kollisionserkennungsroutinen für Grundelemente, boolesche Ergebnisse und/oder Generierung von Mannigfaltigkeiten, Formumsetzungs-/Sweeptest, Raycasts | 1.10 | C/C++ |
niedlich_net | Netzwerkbibliothek für Spiele, die eine optionale Zuverlässigkeitsschicht über UDP mit einem integrierten Sicherheitsschema erfordern | 1.03 | C/C++ |
niedlich_gekachelt | Sehr effizienter Loader für gekachelte Karten, die in das JSON-Format exportiert werden | 1.07 | C/C++ |
niedlich_aseprite | Parst .ase/.aseprite-Dateien in eine kompakte und praktische Struktursammlung | 1.04 | C/C++ |
niedlicher_Sound | Laden/Wiedergeben/Loop (mit Plugin)/Pan WAV + OGG (stb_vorbis Wrapper für OGG) in Mono/Stereo, leistungsstarker benutzerdefinierter Mixer, Musik + Crossfade-Unterstützung | 2.08 | C/C++ |
niedlich_math | 3D-Vektormathematik auf professionellem Niveau über SSE-Intrinsics | 1.02 | C++ |
niedlich_png | Laden/Speichern von PNG, Texturatlas-Compiler, DEFLATE-kompatibler Dekomprimierer | 1.05 | C/C++ |
cute_spritebatch | Laufzeit-2D-Sprite-Batcher. Erstellt Atlanten im laufenden Betrieb im Speicher. Nützlich, um einen Sprite-Batcher für jeden Zweck (z. B. 2D-Spiele) für Hochleistungs-Rendering zu implementieren, ohne dass Texturatlanten auf der Festplatte vorkompiliert werden müssen. | 1.06 | C/C++ |
niedlich_sync | Sammlung praktischer Synchronisierungsprimitive, einschließlich Lese-/Schreibsperre und Threadpool/Task-System | 1.01 | C/C++ |
niedlich_tls | Erstellen Sie eine TLS-Verbindung zu einer Website über TCP, nützlich für HTTPS-Anfragen. | 1.01 | C/C++/Obj-C |
Im Allgemeinen weisen diese Header keine Abhängigkeiten auf und sollen direkt in Ihre Quelle eingefügt werden (überprüfen Sie jeden Header auf spezifische Dokumentation am Anfang der Datei). Jeder Header hat ein LIBNAME_IMPLEMENTATION-Symbol; Fügen Sie dies zu einer einzelnen Übersetzungseinheit in Ihrem Code hinzu und fügen Sie den Header direkt danach ein, um Bibliothekssymbole zu definieren. Ansonsten fügen Sie einfach den Header wie gewohnt ein.
Einige Header enthalten auch Beispielcode oder Demos. Suchen Sie in diesem Repo einfach nach den entsprechenden Beispiel- oder Testordnern. Die Beispielordner sind besonders nützlich, um herauszufinden, wie ein bestimmter Header verwendet wird.
Hier ist ein Link zum Discord-Chat für cute_headers. Kommen Sie gerne vorbei und stellen Sie Fragen, machen Sie Vorschläge oder führen Sie eine Diskussion. Wenn jemand niedliche_headers verwendet hat, wäre es toll, Ihre Erfahrungen zu hören! https://discord.gg/2DFHRmX
Eine weitere einfache Möglichkeit, mich zu erreichen, ist auf Twitter @randypgaul.
- Welchen Sinn hat es, eine einzelne Datei zu erstellen? Warum gibt es in den Headern Implementierungs- und statische Funktionen?
Das Einfügen dieser Header ist wie das Einfügen eines normalen Headers. Um die Implementierung zu definieren, sieht jeder Header jedoch etwa so aus:
// 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"
Dadurch wird die Datei einmal in eine Kombination aus Header und C-Datei umgewandelt. Der Sinn dabei ist: A) Die Handhabung des Headers oder das Versenden an andere ist einfach, keine ZIP-Dateien oder ähnliches, einfach eine einzelne Datei kopieren und einfügen; B) Build-Skripte sind nervig und diese Einzeldatei-Bibliotheken können in jedes Projekt integriert werden, ohne ein einziges Build-Skript zu ändern.
- Ruiniert das Schreiben des gesamten Codes in einem Header nicht die Kompilierungszeiten?
Das Stigma, dass Header-Implementierungen die Kompilierzeit verlangsamen, ist auf eingebetteten Code und Vorlagen-Spam zurückzuführen. In beiden Fällen muss jede einzelne Übersetzungseinheit den Header durcharbeiten und Inline-Versionen von Funktionen platzieren oder bei Vorlagen verschiedene typspezifische Funktionen generieren. Es wird noch schlimmer, wenn der Linker eingreift und Übersetzungseinheiten zusammenfügen muss, wodurch duplizierte Symbole gelöscht werden. Bei Linkern handelt es sich häufig um Single-Thread-Aufgaben, die zu erheblichen Engpässen bei der Erstellungszeit führen können.
Ein gut konstruierter Einzeldatei-Header verwendet keine Vorlagen und geht sparsam mit Inline um. Darüber hinaus verwenden gut konstruierte Einzeldatei-Header ein #define, um die Implementierung (die Funktionsdefinitionen und Symbole) in einer einzigen Übersetzungseinheit zu platzieren. Auf diese Weise ist ein gut gestalteter Einzeldatei-Header so ziemlich das Beste, was ein C-Compiler finden kann, was die Build-Zeit betrifft. Vor allem, wenn der Header optional nicht benötigte Funktionen #definieren kann.
- Sind diese Nur-Header-Bibliotheken nicht nur eine neue Modeerscheinung?
Ich persönlich weiß nicht wirklich, ob es eine Modeerscheinung ist oder nicht, aber diese Dateien sind nicht wirklich nur Header. Es handelt sich um Header, an deren Ende der .C-Dateiteil (die Implementierung) angehängt ist. Es sind zwei verschiedene Dateien, die mit dem C-Präprozessor zusammengehalten werden, aber der Implementierungsteil wird nie angezeigt, es sei denn, der Benutzer führt #define LIB_IMPLEMENTATION aus. Dieser Definitionsschritt ist der einzige Integrationsschritt, der zur Verwendung dieser Header erforderlich ist.
Leider ist das Schreiben einer guten Header-Bibliothek ziemlich schwierig, daher ist jede zufällige Header-Bibliothek, die es in freier Wildbahn gibt, wahrscheinlich keine gute. STB und RJM sind ziemlich gute Header-Bibliotheken und eine gute Referenz, um eine Vorstellung davon zu bekommen, wie eine gute Header-Bibliothek aussieht. Mattias Gustavsson hat meine Lieblingssammlung an Headern.
- Was ist die Lizenz?
Jede Bibliothek enthält Lizenzinformationen am Ende der Datei. Es besteht die Wahl zwischen Public Domain und Zlib.
- Ich habe nach einem Header gesucht, den ich schon einmal gesehen habe, aber er fehlt. Wo ist es geblieben?
Einige der unbeliebten oder nicht so nützlichen Header wurden veraltet und sind jetzt hier verfügbar.
- *Verfügen Sie über Bibliotheken höherer Ebene? Diese wirken etwas zu niedrig.
Die niedlichen Header sind in der Tat eher niedrig. Sie lösen spezifische Probleme. Wenn Sie auf der Suche nach einem Framework für die Spieleerstellung auf höherer Ebene sind, empfehle ich Ihnen, Cute Framework auszuprobieren, ein 2D-Framework für die Spieleerstellung, das größtenteils auf den verschiedenen hier gezeigten niedlichen Headern auf niedriger Ebene aufbaut.