dlib

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. Заранее благодарен!

 

История


История 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, а также ценные советы. Выражаю также благодарность всем остальным контрибьюторам и тестерам проекта: Олегу Бахареву, John Colvin, Martin Novak, Роману Власову, Valera, Basile Burg, Oleh, GanMatt, Hans-Albert Maritz, Kyle Hunter, Merrick Brown, Дмитрий Неизвестный.

В 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

7 комментариев:

  1. Нашел бы ее раньше, обязательно бы использовал в полном объеме. Теперь у меня велосипеды...

    Я не понял целесообразности dlib.core.aaray и некоторых других контейнеров, когда они есть в фобосе.

    Нашел полезными модули из dlib.geometry и dlib.image. Если добавить пересечение двух мешей, то библиотека станет еще лучше.

    ОтветитьУдалить
    Ответы
    1. Весь dlib.core нуждается в переделке. От многих вещей там можно избавиться, остальное надо переписать. aarray - это так, мой личный велосипед, написанный для статьи о двоичных деревьях в "FPS".
      Насчет пересечения мешей подумаю, но не обещаю, это непростое дело. Думаю, можно будет добавить для начала пересечение конвексных объектов - как раз для физики это нужно. Кстати, когда физический движок cозреет для самостоятельной жизни и обрастет фичами, я его добавлю сюда как dlib.physics.

      Удалить
    2. Начиная с версии 0.5, кстати, контейнеры предполагают ручное управление памятью, они могут пригодиться при создании GC-free приложений.

      Удалить
  2. Провел небольшой бенчмарк на перемножение двух матриц 4х4
    dlib.math ~2300 миллисекунд
    gfm.math ~270 мс
    glm (c++) ~40 мс
    Написал свою функцию вида
    mat4 mulmat(in mat4 m1, in mat4 m2)
    {
    mat4 result=void;
    result.arrayof[0]=m1.arrayof[0]*m2.arrayof[0] + m1.arrayof[1]*m2.arrayof[4] + m1.arrayof[2]*m2.arrayof[8] + m1.arrayof[3]*m2.arrayof[12];
    ......
    result.arrayof[15]=m1.arrayof[12]*m2.arrayof[3] + m1.arrayof[13]*m2.arrayof[7] + m1.arrayof[14]*m2.arrayof[11]+ m1.arrayof[15]*m2.arrayof[15];
    return result;
    }
    тест выдал ~100 мс
    Передача матриц в функцию по ссылке сокращает до ~50мс.
    Подтяните математический модуль. В остальном прекрасная библиотека. Спасибо!

    ОтветитьУдалить
    Ответы
    1. Да, подобная оптимизация для матриц 3x3 и 4x4 не помешает, обязательно сделаем.

      Удалить
  3. Никогда не заглядывал на эту страницу блога. Даже не думал, что здесь такое подробное описание с указанием контрибьюторов.
    Кстати, в какой-то момент я сменил ник на гитхабе на FreeSlave (не мог сразу зарегистрироваться под ним, т.к. он был занят. Но юзер, занявший ник, бездействовал, так что его удалили и ник освободился). Перенаправление со старого ника больше не действует. Буду благодарен, если поправите ссылку на github профиль.

    ОтветитьУдалить