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

Сайт проекта: http://gecko0307.github.io/dlib
Репозиторий проекта на GitHub: https://github.com/gecko0307/dlib
Скачать последнюю версию: https://github.com/gecko0307/dlib/releases
Исходники распространяются по либеральной лицензии Boost.

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

Спонсоры проекта: Rafał Ziemniewski, Kumar Sookram, Александр Ковалев, Robert Georges, Jan Jurzitza (WebFreak), Раис Сафиуллин (SARFEX). Огромное спасибо за вашу поддержку!

Выражаю также благодарность всем контрибьюторам и тестерам проекта: 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 начался в 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 поддержку сокетов и функции, связанные с вебом.

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

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

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

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

  • 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 – программа, рисующая множество Мандельброта
  • dnoise – сборник различных генераторов шума
  • Multi monitor wallpaper maker – утилита для генерирования обоев под различные конфигурации мониторов
  • aoynthesizer – скриптовый звуковой синтезатор с lisp-подобным языком
  • decs – реализация Entity-Component-System
  • SMSFontConverter – генератор шрифтов для Sega Master System

Статьи по dlib

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