dlib – это коллекция библиотек на D, которую я написал в качестве основы для своих проектов. dlib можно использовать для разработки игр и игровых движков, систем рендеринга, графических редакторов, мультимедийных и научно-инженерных приложений.

Сайт проекта: http://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

Если вы заинтересованы в развитии этого проекта, поддержите его на Patreon: https://www.patreon.com/gecko0307. Все, кто пожертвует $10 и выше, будут перечислены в списке спонсоров на этой странице, в репозитории и на сайте dlib. Вы также можете сделать разовое пожертвование через PayPal: https://www.paypal.me/tgafarov. Заранее благодарен!

Спонсоры проекта: 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.

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

На сегодняшний день 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 – сериализация и десериализация данных (XML, JSON);
  • dlib.coding – различные алгоритмы кодирования и сжатия данных. Этот пакет носит служебный характер, и его развитие не имеет первоочередного приоритета (новая функциональность добавляется, если это требуется в более важных модулях).

Примеры использования

dlib активно используется в моих других разработках (Dagon, Electronvolt), поэтому ее пригодность для решения реальных задач многократно проверена на практике. Вот еще несколько интересных сторонних проектов, использующих библиотеку:

  • Shader Playground – приложение для экспериментов с шейдерами
  • sacengine – свободная реализация движка игры Sacrifice
  • Ominbot – бот Discord, который разговаривает только существительными
  • Voronoi Diagram – программа, рисующая диаграммы Вороного
  • Laser Patriarch – игра для Ludum Dare 36, “рогалик” со случайно генерируемой картой
  • Anchovy – мультимедийная библиотека для разработки игр и графических приложений
  • Dlang UI – один из самых популярных графических тулкитов для D
  • Atoll – форк DlangUI
  • RIP – библиотека анализа и обработки изображений от LightHouse Software
  • GeneticAlgorithm – библиотека генетических алгоритмов
  • Evael – игровой движок на основе OpenGL 3.3
  • Voxelman – воксельный 3D-движок
  • Orb – еще один воксельный графический движок
  • Leptbag – программа-симулятор для моделирования трехмерных физических систем от японского разработчика Gamma-Lab. Сама программа написана на C++, но плагины к ней можно писать на D, и API для плагинов использует dlib
  • d2d – двумерный игровой движок
  • CKeen-clone – римейк игры Commander Keen
  • AppleCave – игра по мотивам мультфильма “My Little Pony”
  • D-VXLMapPreview – генератор изометрических превью для карт Ace of Spades и Iceball
  • alpha-bleeding – инструмент для альфа-блидинга изображений PNG (т.е., замены черного цвета цветом изображения для прозрачных пикселей, что необходимо для корректного альфа-смешивания в приложениях)
  • dlib-webp – кодер/декодер изображений формата WebP
  • random-dlib-image – генератор случайных изображений с окружностями
  • mandelbrot-dlib – программа, рисующая множество Мандельброта
  • Mandelbrot experiment – программа, рисующая множество Мандельброта
  • dnoise – сборник различных генераторов шума
  • Multi monitor wallpaper maker – утилита для генерирования обоев под различные конфигурации мониторов
  • aoynthesizer – скриптовый звуковой синтезатор с lisp-подобным языком
  • decs – реализация Entity-Component-System
  • Valhalla ECS – реализация Entity-Component-System
  • SMSFontConverter – генератор шрифтов для Sega Master System

Статьи по 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 не будет опубликован. Обязательные поля помечены *