Новости по dlib

Давненько я не отчитывался по прогрессу разработки dlib — а ведь с выхода 0.6.0 уже немало воды утекло. На данный момент актуальная версия библиотеки — 0.6.4, не за горами уже релиз 0.7.0. Вот наиболее важные нововведения:

  • Начиная с версии 0.6.1 в dlib.core.memory доступен встроенный профайлер памяти. Если собрать библиотеку с version-ключом MemoryDebug, то он будет вести отчет по выделениям динамической памяти — если вы обнаружили утечку, профайлер поможет выяснить, какие объекты создавались и не были удалены на момент вывода отчета. К сожалению, из-за ограничений языка, пока невозможно сохранять информацию о модулях и номерах строк, в которых произошло выделение памяти (это упростило бы отладку утечек до предела), но не исключено, что в будущем такая возможность все-таки появится.
  • Серьезное обновление dlib.image — с версии 0.6.2 декодер PNG больше не отражает изображение по вертикали. Это привело к многочисленным регрессионным ошибкам, так что приношу извинения за неудобства, если у вас тоже что-то сломалось. Кстати, обновился и экспортер PNG — теперь он корректно сохраняет несжимаемые изображения, такие, как пиксельарт. Появился модуль dlib.image.render.shapes с базовыми функциями рисования линий и фигур.
  • В версии 0.6.4 обновился пакет dlib.math, были оптимизированы перемножение матриц и доступ к элементам вектора.
  • Появился новый контейнер std.container.dict — универсальный ассоциативный массив, более совершенная замена std.container.aarray, который теперь помечен как deprecated. Dict реализован на основе префиксного дерева, что позволяет использовать любой тип данных в качестве ключа без необходимости определять хэш-функцию. В плане синтаксиса Dict в целом аналогичен встроенному ассоциативному массиву D, но не выделяет память через сборщик мусора.

Что касается планов на будущее, то на сегодняшний день в приоритете — дальнейший перевод dlib на ручное управление памятью. В версии 0.7.0, например, появятся независимые от Phobos и druntime потоки, а также полностью ручной связный список. Кроме того, будет переписан std.xml.
В более долгосрочной перспективе — будет серьезно улучшен пакет dlib.image, появится потоково-ориентированная система для обработки изображений путем построения направленных графов. Появится поддержка прогрессивного JPEG.
Не исключено также появление инструментов работы с сетью, примитивов для создания серверов (dlib.network?).

Статьи по dlib

На сайте студии LightHouse Software, использующей и активно продвигающей язык D, опубликовано несколько интересных статей по использованию коллекции библиотек dlib — в частности, о рисовании фрактала Курликю и графических примитивов с использованием dlib.image, а также о процедурном генерировании картинки с Псаем с последующим сохранением в файл.

http://lhs-blog.info/programming/dlang/fraktal-kurlikyu
http://lhs-blog.info/programming/dlang/dobavlenie-graficheskih-primitivov-v-dlib
http://lhs-blog.info/programming/dlang/gangnam-style-v-d
http://lhs-blog.info/programming/dlang/sohranenie-izobrazheniya-v-fayl

Обновление всех проектов

На днях обновились библиотеки dlib, dmech, DGL и игра Atrium.

  • В коллекции библиотек dlib 0.6.0 значительно улучшен декодер JPEG, добавлена поддержка новых типов прореживания и APP-маркеров. Улучшено управление памятью (удалять теперь объекты можно через интерфейсы и родительские классы), добавлены независимые от сборщика мусора реализации классов изображений и файловых потоков. В пакете dlib.math появилась реализация некоторых идиом комбинаторики (dlib.math.combinatorics).
  • Физический движок dmech 0.2.0 включает необходимые изменения для поддержки dlib 0.6.x. Также к движку теперь прилагается небольшая документация в виде уроков.
  • DGL/GC-free, независимая от сборщика мусора ветка проекта, теперь тоже переведена на dlib 0.6.x.
  • Вышла первая альфа-версия Atrium (0.0.1a). Релиз, главным образом, обозначил перевод игры на последние версии вышеперечисленных библиотек. Есть готовые сборки для Windows и Linux.

Бенчмарк загрузки PNG

Не так давно один из участников сообщества D провел любопытный тест, сравнив скорости загрузки изображения в формате PNG с различными библиотеками. В сравнении участвовали D-библиотеки (dlib и imageformats), а также C#.

Использовалось RGB-изображение размером 2048х2048, компилятор DMD 2.0.67 c флагами -release -inline -O. Задачей была загрузка из PNG, отражение по горизонтали и сохранение в PNG. Результат получился следующий:

C#:
Загрузка — 90 мс
Отражение — 10 мс
Сохранение — 380 мс

D (dlib):
Загрузка — 500 мс
Отражение — 30 мс
Сохранение — 950 мс

D (imageformats):
Загрузка — 230 мс
Отражение — 30 мс
Сохранение — 1100 мс

Тред с обсуждением

На днях обязательно сделаю собственный тест — необходимо выяснить, что именно тормозит в декодере.

dlib 0.5

Не так давно состоялось очередное крупное обновление коллекции библиотек dlib — вышла версия 0.5, наиболее значительным нововведением которой стала поддержка ручного управления памятью (РУП). Но — обо всем по порядку…

  • Новый модуль dlib.core.memory предоставляет средства для ручного выделения и высвобождения динамической памяти, независимые от сборщика мусора и основанные на malloc/free. Имеется поддержка структур, классов и массивов. При использовании классов рекомендуется использовать интерфейс ManuallyAllocatable и перегружать метод free, который ответственен за удаление объекта — в противном случае корректное удаление в некоторых случаях не гарантировано (например, при доступе через интерфейс или родительский класс).
  • Началась работа по переводу всей dlib на РУП. Так, загрузчики изрбражений (PNG, JPEG, TGA, BMP) в новой версии полностью независимы от сборщика мусора. Для этого активно используется паттерн абстрактной фабрики, ответственный за создание изображений  в памяти. Кстати, в загрузчике PNG значительно улучшена поддержка индексированных изображений, для них добавлена поддержка альфа-канала.
  • Кроме того, на РУП переведены некоторые контейнеры из dlib.container — BST, ассоциативный массив. Реализован полностью ручной динамический массив (dlib.container.array).
  • Еще одна новинка — ООП для структур (dlib.core.oop). Это экспериментальный модуль, реализующий для структур прототипный стиль ООП с поддержкой множественного наследования и параметрического полиморфизма. Полностью заменить классы он, конечно, не может, но окажется весьма полезен, если нужно создавать объекты с наследованием в стеке. В будущем планируется переписать некоторые внутренние механизмы dlib с использованием этой легковесной объектной системы.
  • В пакете dlib.math появилась поддержка дуальных кватернионов. Это частный случай алгербы Клиффорда, обобщение кватернионов на поле дуальных чисел. Их можно использовать, например, для описания движения тел в кинематике — один дуальный кватернион охватывает и перенос, и вращение. Кстати, реализация обычных кватернионов через инкапсуляцию теперь совместима с векторами.
  • Изменения коснулись и пакета вычислительной геометрии. Усеченная пирамида (dlib.geometry.frustum) теперь задается с нормалями ограничивающих плоскостей, указывающими наружу пирамиды. Подвергся изменению API проверки пересечения Frustum с AABB. Исправлены ошибки в реализации AABB и плоскости.