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 активно используется в моих других разработках (dmech, Dagon, Atrium), поэтому ее пригодность для решения реальных задач многократно проверена на практике. Вот еще несколько интересных сторонних проектов, использующих библиотеку:
На сайте LightHouse Software:
Сайт проекта: 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:
- Дискретное вейвлет-преобразование в dlib / aquaratixc, 2019
- Формула Таппера в D / aquaratixc, 2019
- Множество Мандельброта в dlib / aquaratixc, 2019
- Эксперименты с квадратными паттернами в dlib / aquaratixc, 2019
- Добавляем итерируемые системы функций в dlib / aquaratixc, 2018
- Соляризация изображения в dlib / aquaratixc, 2018
- Экспериментируем с битовыми плоскостями. Часть I / aquaratixc, 2018
- Экспериментируем с битовыми плоскостями. Часть II / aquaratixc, 2018
- Музыкальный D: синтезатор в 100 строк / Gecko, 2018
- Преобразование карт окружения при помощи dlib / Gecko, 2018
- Вставка сообщений в изображения / aquaratixc, 2018
- Создаем "термокарту" изображения / aquaratixc, 2017
- Векторная графика в dlib / Gecko, 2017
- Обработка изображений: цифровые фильтры / aquaratixc, 2017
- Стеганография в dlib / Gecko, 2016
- dlib.image и OpenCL / Gecko, 2016
- Убираем "лишние" цвета / aquaratixc, 2015
- Сверточная "магия" или как я сам сделал цифровой фильтр / aquaratixc, 2015
- Медианный фильтр в D / aquaratixc, 2015
- Просто добавь немного шума / aquaratixc, 2015
- Обработка изображений: делаем фотографию черно-белой своими руками / aquaratixc, 2015
- Создание гистограмм изображений / aquaratixc, 2015
- Фрактал Курликю / aquaratixc, 2015
- Добавление графических примитивов в dlib / aquaratixc, 2015
- Gangnam style в D / aquaratixc, 2015
- Сохранение изображения в файл / aquaratixc, 2015
- Рисование множества Мандельброта с помощью dlib (на японском, автоперевод) - Kotet, 2017
- Паттерн "Стратегия" в D: строим простое семейство алгоритмов для отрисовки графических примитивов / aquaratixc, DProgramming, 2015 (заархивировано)
- Дуальные числа и автоматическое дифференцирование / Тимур Гафаров / 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.core.aaray и некоторых других контейнеров, когда они есть в фобосе.
Нашел полезными модули из dlib.geometry и dlib.image. Если добавить пересечение двух мешей, то библиотека станет еще лучше.
Весь dlib.core нуждается в переделке. От многих вещей там можно избавиться, остальное надо переписать. aarray - это так, мой личный велосипед, написанный для статьи о двоичных деревьях в "FPS".
УдалитьНасчет пересечения мешей подумаю, но не обещаю, это непростое дело. Думаю, можно будет добавить для начала пересечение конвексных объектов - как раз для физики это нужно. Кстати, когда физический движок cозреет для самостоятельной жизни и обрастет фичами, я его добавлю сюда как dlib.physics.
Начиная с версии 0.5, кстати, контейнеры предполагают ручное управление памятью, они могут пригодиться при создании GC-free приложений.
УдалитьПровел небольшой бенчмарк на перемножение двух матриц 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мс.
Подтяните математический модуль. В остальном прекрасная библиотека. Спасибо!
Да, подобная оптимизация для матриц 3x3 и 4x4 не помешает, обязательно сделаем.
УдалитьНикогда не заглядывал на эту страницу блога. Даже не думал, что здесь такое подробное описание с указанием контрибьюторов.
ОтветитьУдалитьКстати, в какой-то момент я сменил ник на гитхабе на FreeSlave (не мог сразу зарегистрироваться под ним, т.к. он был занят. Но юзер, занявший ник, бездействовал, так что его удалили и ник освободился). Перенаправление со старого ника больше не действует. Буду благодарен, если поправите ссылку на github профиль.
Поправил, спасибо за замечание.
Удалить