dlib
dlib – это коллекция библиотек на D, которую я написал в качестве основы для своих проектов. dlib можно использовать для разработки игр и игровых движков, систем рендеринга, графических редакторов, мультимедийных и научно-инженерных приложений.
Сайт проекта: https://gecko0307.github.io/dlib
Репозиторий проекта на GitHub: https://github.com/gecko0307/dlib
Скачать последнюю версию: https://github.com/gecko0307/dlib/releases
Исходники распространяются по либеральной лицензии Boost.
Документация: https://gecko0307.github.io/dlib/docs/dlib.html
Спонсоры проекта: Daniel Laburthe, Rafał Ziemniewski, Kumar Sookram, Александр Ковалев, Robert Georges, Jan Jurzitza (WebFreak), Раис Сафиуллин (SARFEX), Benas Cernevicius, Koichi Takio, Константин Меньшиков. Огромное спасибо за вашу поддержку!
Выражаю также благодарность всем контрибьюторам и тестерам проекта: Martin Сejp, Eugene Wissner, Nick Papanastasiou, Олегу Бахареву, Вадиму Лопатину, Роману Чистоходову, Андрею Пенечко, John Colvin, Martin Novak, Роману Власову, Valera, Basile Burg, Oleh, GanMatt, Hans-Albert Maritz, Kyle Hunter, Merrick Brown, Дмитрию Неизвестному, Александру Перфильеву.
История
История dlib началась в 2010-11 годах, когда я познакомился с D. Тогда у меня был свой небольшой игровой движок на C++ (Phantom3D), и я решил портировать его на D2 – язык в те годы как раз стабилизировался. Начал, естественно, с векторной алгебры – так появился dlib.math, старейший и наиболее законченный из пакетов dlib. Сам 3D-движок, конечно, претерпел немало трансформаций и, в итоге, от старого кода почти ничего не осталось – мой следующий движок DGL был написан почти с нуля, хотя и начинался как полный порт Phantom3D и сначала носил то же название.
Затем я решил постепенно избавиться от зависимостей от сторонних библиотек (вроде LodePNG) и с этой целью вывел весь сторонний код загрузки изображений в отдельную C++-библиотеку Sparx, которую использовал в D через Derelict. Но это было не очень удобно, поэтому следующим этапом стало переписывание Sparx на D, в результате чего родился dlib.image (сейчас, правда, старого кода из Sparx там очень мало). Практически сразу после этого я написал dlib.xml – он использовался для обеспечения совместимости с моим старым форматом хранения шейдеров, основанным на XML. На сегодняшний день XML в моих проектах уже не используется, но модуль остался.
Как открытый проект dlib существует с 2012 года, но самый интересный этап в его жизни начался в 2013, когда разработка библиотеки была перенесена с Google Code на GitHub. Появился модуль dlib.core, к проекту примкнули новые разработчики: Martin Сejp провел огромную работу по реализации потоков ввода-вывода и абстрактной файловой системы (dlib.core.stream, dlib.filesystem), Eugene Wissner написал сетевой пакет (dlib.network) и аллокаторы памяти (dlib.memory), Nick Papanastasiou написал модуль комбинаторики, Вадим Лопатин (к слову, автор знаменитой читалки Cool Reader) помог улучшить декодер PNG, Роман Чистоходов и Андрей Пенечко внесли множество исправляющих патчей. Отдельное спасибо Роману за улучшенную поддержку BMP и TGA, а также ценные советы.
В 2015 году начался перевод dlib на ручное управление памятью. Появились динамические массивы и другие контейнеры, не зависящие от сборщика мусора, на ручное управление памятью переведены загрузчики изображений в dlib.image. Эта грандиозная работа была полностью завершена в 2019 году.
В 2016 году появился пакет dlib.audio, который может служить бэкендом для звуковых движков, плееров, DAW и т.д. Пока реализованы только базовые функции, но пакет будет развиваться. Также появился пакет dlib.network, который содержит независимую от Phobos поддержку сокетов и функции, связанные с вебом.
В 2021 году работа над основной функциональностью библиотеки была завершена, и началась подготовка к выпуску версии 1.0. На стадии планирования dlib 2.0.
В феврале 2022 года вышел dlib 1.0.0.
Функциональность
На сегодняшний день dlib содержит следующие пакеты модулей:
- dlib.core – ключевые компоненты, которые используются остальными пакетами (средства управления памятью, потоки ввода-вывода, вычислительные потоки, мьютексы и т.д.);
- dlib.memory – интерфейс и несколько разных реализаций аллокаторов динамической памяти, независимых от сборщика мусора. В перспективе планируется перевести на аллокаторы большую часть dlib;
- dlib.container – универсальные структуры данных с ручным управлением памятью (динамический массив, словарь, связный список, стек, очередь и т.д.);
- dlib.filesystem – абстрактный интерфейс файловой системы и его реализации для Windows и POSIX-систем, независимые от Phobos. Пакет обеспечивает универсальный потоковый доступ к файлам, позволяет строить виртуальные файловые системы;
- dlib.math – линейная алгебра и вычислительная математика. Векторы, квадратные матрицы, кватернионы, комплексные и дуальные числа, БПФ, разложение, решение СЛАУ, интерполяция и т.д.;
- dlib.geometry – вычислительная геометрия (лучи, примитивы, пересечения тел);
- dlib.image – обработка изображений (цветокоррекция, фильтры, поддержка графических форматов JPEG, PNG, TGA, BMP и HDR, поддержка буферов в цветовом пространстве RGBA с 8 и 16 бит на канал, а также операций с плавающей запятой);
- dlib.audio – обработка звука (8 и 16 бит на сэмпл, произвольное количество каналов, импорт/экспорт WAV, простейшие синтезаторы);
- dlib.network – кроссплатформенная сетевая библиотека, сокеты;
- dlib.text – работа с кодировками, обработка строк и текстов (есть декодеры UTF-8 и UTF-16, очень быстрый лексический анализатор и множество вспомогательных функций);
- dlib.serialization – работа со стандартными форматами разметки: JSON и XML;
- dlib.coding – различные алгоритмы кодирования и сжатия данных. Этот пакет носит служебный характер, и его развитие пока не имеет первоочередного приоритета (новая функциональность добавляется, если это требуется в более важных модулях).
Примеры использования
dlib активно используется в моих других разработках (Dagon, Electronvolt), поэтому ее пригодность для решения реальных задач многократно проверена на практике. Вот еще несколько интересных сторонних проектов, использующих библиотеку:
- Shader Playground – приложение для экспериментов с шейдерами
- sacengine – свободная реализация движка игры Sacrifice
- Ominbot – бот Discord, который разговаривает только существительными
- Voronoi Diagram – программа, рисующая диаграммы Вороного
- Laser Patriarch – игра для Ludum Dare 36, “рогалик” со случайно генерируемой картой
- Anchovy – мультимедийная библиотека для разработки игр и графических приложений
- Dlang UI – один из самых популярных графических тулкитов для D
- RIP – библиотека анализа и обработки изображений от LightHouse Software
- GeneticAlgorithm – библиотека генетических алгоритмов
- Re Engine FX (rengfx) – игровой движок на основе raylib.
- Evael – игровой движок на основе OpenGL 3.3
- Voxelman – воксельный 3D-движок
- Orb – еще один воксельный графический движок
- Leptbag – программа-симулятор для моделирования трехмерных физических систем от японского разработчика Gamma-Lab. Сама программа написана на C++, но плагины к ней можно писать на D, и API для плагинов использует dlib
- d2d – двумерный игровой движок
- D-VXLMapPreview – генератор изометрических превью для карт Ace of Spades и Iceball
- alpha-bleeding – инструмент для альфа-блидинга изображений PNG (т.е., замены черного цвета цветом изображения для прозрачных пикселей, что необходимо для корректного альфа-смешивания в приложениях)
- dlib-webp – кодер/декодер изображений формата WebP
- mandelbrot-dlib – программа, рисующая множество Мандельброта
- Mandelbrot experiment – программа, рисующая множество Мандельброта
- aoynthesizer – скриптовый звуковой синтезатор с lisp-подобным языком
- decs – реализация Entity-Component-System (архивный проект)
- SMSFontConverter – генератор шрифтов для Sega Master System
- Crafted – клон Minecraft
Статьи по dlib
Мои статьи в блоге:
- Необычный паттерн: объект-самоубийца / 2024
- Музыкальный D: синтезатор в 100 строк / 2018
- Фокусы с Compound / 2017
- Векторная графика в dlib / 2017
- Стеганография в dlib / 2016
- Chroma Key с использованием dlib / 2014
- Дуальные числа и касательная к кривой Безье / 2013
Мои статьи на Medium:
- dlib: Past, Present and Future / Gecko, 2021
- Alternative Memory Management in D / Gecko, 2018
Статьи на сайте LightHouse Software:
- Акварелизация изображения с помощью dlib / aquaratixc, 2022
- Просматриваем изображения в терминале с помощью dlib / aquaratixc, 2022
- Реализуем дизеринг в dlib / aquaratixc, 2022
- Пиксельные войны: как создать свой Pixelflut-сервер на D / aquaratixc, 2021
- Папоротник Барнсли для Rosetta Code / aquaratixc, 2021
- Эквализация гистограмм / aquaratixc, 2020
- Добавляем текст на изображения в dlib / aquaratixc, 2019
- Отрисовка и закраска многоугольников в dlib / aquaratixc, 2019
- Дискретное вейвлет-преобразование в dlib / aquaratixc, 2019
- Формула Таппера в D / aquaratixc, 2019
- Множество Мандельброта в dlib / aquaratixc, 2019
- Эксперименты с квадратными паттернами в dlib / aquaratixc, 2019
- Добавляем итерируемые системы функций в dlib / aquaratixc, 2018
- Соляризация изображения в dlib / aquaratixc, 2018
- Экспериментируем с битовыми плоскостями. Часть I / aquaratixc, 2018
- Экспериментируем с битовыми плоскостями. Часть II / aquaratixc, 2018
- Музыкальный D: синтезатор в 100 строк / Gecko, 2018
- Преобразование карт окружения при помощи dlib / Gecko, 2018
- Вставка сообщений в изображения / aquaratixc, 2018
- Создаем “термокарту” изображения / aquaratixc, 2017
- Векторная графика в dlib / Gecko, 2017
- Обработка изображений: цифровые фильтры / aquaratixc, 2017
- Стеганография в dlib / Gecko, 2016
- dlib.image и OpenCL / Gecko, 2016
- Убираем “лишние” цвета / aquaratixc, 2015
- Сверточная “магия” или как я сам сделал цифровой фильтр / aquaratixc, 2015
- Медианный фильтр в D / aquaratixc, 2015
- Просто добавь немного шума / aquaratixc, 2015
- Обработка изображений: делаем фотографию черно-белой своими руками / aquaratixc, 2015
- Создание гистограмм изображений / aquaratixc, 2015
- Фрактал Курликю / aquaratixc, 2015
- Добавление графических примитивов в dlib / aquaratixc, 2015
- Gangnam style в D / aquaratixc, 2015
- Сохранение изображения в файл / aquaratixc, 2015
Статьи на других сайтах:
- Минимизация PNG / Gecko, 2022
- Паттерн “Стратегия” в D: строим простое семейство алгоритмов для отрисовки графических примитивов / aquaratixc, DProgramming, 2015 (заархивировано)
Статьи в журнале “FPS”:
- Дуальные числа и автоматическое дифференцирование / Тимур Гафаров / FPS №25 ’13
- Обработка изображений в dlib.image / Тимур Гафаров / FPS №25 ’13
- Математика в dlib / Тимур Гафаров / FPS №27 ’14
- Рисуем фрактал на D / Тимур Гафаров / FPS №28 ’14
- Эффект Chroma Key / Тимур Гафаров / FPS №33 ’14
- Математическая графика в dlib / Олег Бахарев / FPS №37 ’15
- Шаблонная “магия” в dlib: ООП на структурах / Тимур Гафаров / FPS №41 ’16
- dlib: практикум. Выпуск 1. Фокусы с Compound / Тимур Гафаров / FPS №47 ’17
- dlib: практикум. Выпуск 2. Фильтры / Тимур Гафаров / FPS №48 ’17