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.

В марте 2024 года библиотека достигла пиковой популярности за все время существования проекта: 14000 скачиваний в месяц через репозиторий пакетов DUB.

Функциональность

На сегодняшний день 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

Мои статьи в блоге:

Мои статьи на Medium:

Статьи на сайте LightHouse Software:

Статьи на других сайтах:

Статьи в журнале “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

Оставить комментарий

Ваш адрес email не будет опубликован.