Различные однофайловые кроссплатформенные заголовки C/C++, реализующие автономные библиотеки.
библиотека | описание | последняя версия | язык(и) |
---|---|---|---|
cute_c2 | Процедуры двумерного обнаружения столкновений на примитивах, логические результаты и/или генерация многообразия, тест приведения формы/прогонки, raycasts | 1.10 | С/С++ |
cute_net | Сетевая библиотека для игр, требующих дополнительного уровня надежности через UDP со встроенной схемой безопасности. | 1.03 | С/С++ |
cute_tiled | Очень эффективный загрузчик тайловых карт, экспортированных в формат JSON. | 1.07 | С/С++ |
cute_aseprite | Анализирует файлы .ase/.aseprite в компактную и удобную коллекцию структур. | 1.04 | С/С++ |
милый_звук | Загрузка/воспроизведение/зацикливание (с плагином)/панорамирование WAV + OGG (оболочка stb_vorbis для OGG) в моно/стерео, высокопроизводительный пользовательский микшер, поддержка музыки + кроссфейда | 2.08 | С/С++ |
милая_математика | 3D-векторная математика профессионального уровня с использованием встроенных функций SSE | 1.02 | С++ |
милый_png | загрузка/сохранение PNG, компилятор текстурного атласа, декомпрессор, совместимый с DEFLATE | 1.05 | С/С++ |
cute_spritebatch | Баттер 2D-спрайтов во время выполнения. Создает атласы «на лету» в памяти. Полезно для реализации пакетника спрайтов для любых целей (например, 2D-игр) для высокопроизводительного рендеринга без необходимости предварительной компиляции атласов текстур на диске. | 1.06 | С/С++ |
cute_sync | Коллекция практических примитивов синхронизации, включая блокировку чтения/записи и систему пула потоков/задач. | 1.01 | С/С++ |
cute_tls | Создайте TLS-соединение с веб-сайтом через TCP, что полезно для запросов HTTPS. | 1.01 | C/C++/Obj-C |
Обычно эти заголовки не имеют зависимостей и предназначены для включения непосредственно в исходный код (проверьте каждый заголовок на наличие конкретной документации в верхней части файла). Каждый заголовок имеет символ LIBNAME_IMPLEMENTATION; добавьте это в одну единицу перевода в своем коде и сразу после этого включите заголовок, чтобы определить библиотечные символы. В противном случае просто включите заголовок как обычно.
Некоторые заголовки также содержат примеры кода или демо-версии. В этом репозитории просто найдите соответствующие папки примеров или тестов. Примеры папок особенно полезны для понимания того, как использовать тот или иной заголовок.
Вот ссылка на чат дискорда для cute_headers. Не стесняйтесь заходить и задавать вопросы, вносить предложения или обсуждать. Если кто-нибудь использовал cute_headers, было бы здорово услышать ваш опыт! https://discord.gg/2DFHRmX
Еще один простой способ связаться со мной — в твиттере @randypgaul.
- Какой смысл создавать один файл? Почему в заголовках есть реализация и статические функции?
Включение этих заголовков аналогично включению обычного заголовка. Однако для определения реализации каждый заголовок выглядит примерно так:
// 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"
Это превратит файл в комбинацию файлов «заголовок + c» один раз. Суть в том, что: A) обрабатывать заголовок или отправлять его людям легко, никаких zip-файлов или чего-то еще, просто копируйте и вставляйте один файл; Б) сценарии сборки — это головная боль, и эти однофайловые библиотеки можно интегрировать в любой проект без изменения ни одного сценария сборки.
- Разве написание всего кода в заголовке не портит время компиляции?
Клеймо о том, что реализации заголовков замедляют время компиляции, исходит из встроенного кода и спама шаблонов. В любом случае каждая отдельная единица перевода должна пройти через заголовок и разместить встроенные версии функций, или для шаблонов генерировать различные функции, специфичные для типа. Ситуация становится еще хуже, когда включается компоновщик, и ему необходимо объединить единицы перевода, удалив дублированные символы. Часто компоновщики представляют собой однопоточные задачи и могут серьезно затормозить время сборки.
Хорошо построенный заголовок одного файла не будет использовать какие-либо шаблоны и будет экономно использовать встроенные элементы. Кроме того, хорошо построенные заголовки одного файла используют #define для размещения реализации (определений функций и символов) в одной единице перевода. Таким образом, хорошо созданный заголовок одного файла — это, пожалуй, лучшее, что может найти компилятор C, с точки зрения времени сборки. Особенно, когда заголовок может опционально #define ненужных функций.
- Разве эти библиотеки только для заголовков не являются просто новым увлечением?
Лично я не знаю, причуда это или нет, но эти файлы на самом деле не просто заголовки. Это заголовки, к концу которых прикреплена часть файла .C (реализация). Это два разных файла, склеенных вместе с помощью препроцессора C, но часть реализации никогда не отображается, пока пользователь не выполнит #define LIB_IMPLEMENTATION. Этот шаг определения — единственный шаг интеграции, необходимый для использования этих заголовков.
К сожалению, написать хорошую библиотеку заголовков довольно сложно, поэтому любая библиотека случайных заголовков, вероятно, не будет хорошей. STB и RJM — довольно хорошие библиотеки заголовков и хороший справочник, позволяющий получить представление о том, как выглядит хорошая библиотека заголовков. У Маттиаса Густавссона моя любимая коллекция ударов головой.
- Какая лицензия?
Каждая библиотека содержит информацию о лицензии в конце файла. Есть выбор между общественным достоянием и zlib.
- Я искал заголовок, который видел раньше, но он отсутствует. Куда это делось?
Некоторые непопулярные или не очень полезные заголовки устарели и теперь живут здесь.
- *Есть ли у вас библиотеки более высокого уровня? Они кажутся слишком низкоуровневыми.
Симпатичные заголовки действительно довольно низкоуровневые. Они решают конкретные проблемы. Если вы ищете фреймворк для создания игр более высокого уровня, я предлагаю попробовать Cute Framework, фреймворк для создания 2D-игр, построенный в основном на основе различных низкоуровневых симпатичных заголовков, представленных здесь.