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 начался, когда разработка библиотеки была перенесена с 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. Сейчас эта грандиозная работа близится к завершению.

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

dlib активно используется в моих других разработках (dmech, Dagon, Atrium), поэтому ее пригодность для решения реальных задач многократно проверена на практике. Вот еще несколько интересных сторонних проектов, использующих библиотеку:
  • Laser Patriarch - игра для Ludum Dare 36, "рогалик" со случайно генерируемой картой
  • Litecraft - свободный клиент Minecraft
  • Anchovy - мультимедийная библиотека для разработки игр и графических приложений
  • Dlang UI - новый, активно развивающийся графический тулкит для D
  • RIP - библиотека анализа и обработки изображений от LightHouse Software
  • GeneticAlgorithm - библиотека генетических алгоритмов 
  • Voxelman - воксельный 3D-движок
  • Orb - еще один воксельный графический движок
  • 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-подобным языком
Статьи по dlib

Статьи на сайте LightHouse Software:
Ряд статей по dlib был также опубликован в журнале "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
 Статьи на других сайтах:
Все записи с тегом "dlib"

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 профиль.

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