воскресенье, 21 октября 2012 г.

Почему я выбираю Linux?


Последние два года часто приходится слышать о том, что Linux на десктопах «не выстрелил». И что место его – в нише серверов, суперкомпьютеров, встраиваемых систем и мобильных устройств (в качестве Android, MeeGo и др). Не хочется сейчас касаться бессмысленных холиваров а ля «под Линукс нету Фотошопа» – я не буду оправдывать систему перед геймерами, домохозяйками, «офисным планктоном» и прочим подобным контингентом, равно как и агитировать кого-либо переходить на нее. Я просто намерен объяснить, что именно в Linux привлекает среднестатистического хакера – компьютерного энтузиаста-«кулибина», которого, как это ни парадоксально, интересует не наличие прикладного софта, а именно его отсутствие – чтобы был стимул написать свой! В моем случае – отсутствие игр (малый ассортимент, если быть точным). Именно этот факт послужил первой причиной выбора Linux в качестве основной целевой платформы разработки.

Под Linux мало игр – следовательно, высока вероятность, что ваш проект будет оценен по достоинству и получит свою долю популярности. Сравните это с рынком Windows, который настолько перенасыщен, что у «новоприбывших» практически нет никаких шансов – конкуренция слишком высока. Это, конечно, не значит что качественные инди-проекты остаются совсем незамеченными (вспомните историю той же Portal), но факт остается фактом: мир Windows диктует свои правила, и не все в нем способны выжить. Кстати, это относится не только к играм...

В то же время, было бы некорректно утверждать, что мир Linux не диктует никаких правил. Диктует, и еще как. Это вселенная OpenSource, и вам придется так или иначе отдать дань сообществу СПО за то, что пользуетесь свободными программами в своей работе. Неважно, каким именно способом – открытием своих исходников, вкладом в другие открытые проекты, материальным пожертвованием и т. д. Разумеется, это правило неписанное, оно не значится в лицензионных соглашениях. Это скорее этический принцип. Всякий, кто приходит в этот мир, впечатлившись идеалами свободы, горит желанием стать частью движения, чтобы выразить свою благодарность сообществу. И, на мой взгляд, создание свободного игрового проекта – один из лучших способов сделать это.

Поскольку Linux создавался «программистами для программистов», в нем все ориентировано, в первую очередь, на разработку новых и совершенствование существующих инструментов. К примеру, почти все дистрибутивы идут в комлекте с компилятором GCC и рантаймом языка Python – пользователь может запросто, сразу после установки, начать программировать. Сравните это с Windows, где для написания даже простейшего «Hello, World» нужно устанавливать навороченные IDE – часто платные и весьма требовательные к ресурсам. Конечно, можно и в Windows обустроить себе уютное linux-like окружение: установить MinGW или другой набор свободных компиляторов, Posix-утилиты, все необходимые библиотеки – многие так и делают, особенно если нужен кроссплатформенный toolchain. Суть в том, что в Linux этот набор инструментов присутствует изначально. Linux дружественен к разработчику: это заметно везде, в любых мелочах. Вплоть до того, что все линуксовые текстовые редакторы, даже самые простые, поддерживают подсветку синтаксиса.

Есть еще один момент: по очевидным причинам, в Linux доступен только один трехмерный API – OpenGL. В среде программистов бытует устойчивое «суеверие», касающееся интерфейсов разработки 3D-приложений: о том, что для игр больше подходит DirectX, а ниша OpenGL – САПР, промышленная визуализация и научно-исследовательское моделирование. Это происходит из-за дилетантской попытки сравнивать OpenGL именно с DirectX, а не Direct3D. Как известно, DirectX – это не только трехмерная и двумерная графика, но и звук, сеть, взаимодействие с устройствами ввода, библиотеки вспомогательных функций и многое другое. Более корректное сравнение выглядит следующим образом: DirectX vs OpenGL+OpenAL+SDL+FreeType. А это уже, согласитесь, внушительный «арсенал». Причем, доступный не только под Windows и Linux, но и ряд других платформ. А кто станет спорить с тем, что кроссплатформеность – это хорошо?OpenGL в наши дни не просто идеально подходит для разработки игр – на мобильных платформах это и вовсе единственный выбор. Хотите поддержки Android или iOS? Можете забыть о Direct3D. OpenGL – ваш лучший друг.

Разумеется, нельзя забывать о том, что на программировании свет клином не сошелся. Нужны еще средства подготовки контента. Здесь опять на ум приходит вопрос «фотошопов» и «3ds max'ов», но, положа руку на сердце, скажите – неужели для создания моделей, текстур и спрайтов вам недостаточно Blender, GIMP, Inkscape и MyPaint? Photoshop всегда был и остается инструментом фотографов и специалистов по печати, а 3ds max – архитекторов и дизайнеров по интерьерам. Использование этих дорогих и тяжеловесных «монстров» для работы с маленькими изображениями и низкополигональными моделями явно неоправдано. Выходит, в миграции на оупенсорс художникам мешает только консерватизм и сила привычки.

Было бы несправедливо обойти стороной объективные недостатки Linux как десктопной игровой платформы. Если отставить в сторону всякие мифы, суеверия, психологические барьеры, тролль-аргументы вроде «1 процента», остается, на мой взгляд, всего два пункта:

1. Пресловутый «зоопарк дистрибутивов». Даже в рамках одного дистрибутива не так-то просто добиться идеальной совместимости бинарных релизов со всеми версиями ОС – что и говорить о десятках (!) разных операционок... Можно, конечно, нацелиться только на один популярный дистрибутив – скажем, на ту же Ubuntu – и говорить, что все остальное официально не поддерживается. Но это не в духе Linux, за такое пользователи вас добрым словом не помянут. Если ваша игра распространяется по свободной лицензии, можно посылать всех самостоятельно компилировать ее из исходников. Есть и третий вариант – как мне кажется, наиболее вменяемый: официально выпускать один универсальный бинарный релиз, собранный для старой версии Glibc (скажем, 2.7) и имеющий минимум зависимостей, а индивидуальные пакеты для всех популярных дистров поддерживать на базе сообщества. Так делают, например, разработчики Blender. И на протяжении 10 лет у них это успешно получается.

2. Ситуация с видеодрайверами. Производители видеокарт все еще ориентируются, в основном, на Windows. Драйверы для всего остального обычно запаздывают с выходом и уступают по качеству. Но поддержка Linuх не так плоха, как могла бы быть. Если у вас видеокарта от NVIDIA или Intel, можно радоваться, но ситуация с AMD значительно хуже...

Как видите, оба пункта отнюдь не смертельны и для большинства линуксоидов совершенно не критичны. Думаю, излишне упоминать о стабильности, надежности и безопасности Linux-систем, и в качестве хост-системы для различных разработок и экспериментов они не имеют равных.

четверг, 4 октября 2012 г.

Передискретизация в dlib.image

Передискретизация (ресэмплинг) изображения - это всего-навсего изменение его разрешения в пикселях. Такую функцию должна включать любая уважающая себя библиотека обработки изображений, и с сегодняшнего дня dlib - не исключение. В пакете dlib.image.resampling доступны четыре алгоритма ресэмплинга, которые часто встречаются в графических редакторах: линейная интерполяция (Linear или Nearest Neighbor), билинейная (Bilinear), бикубическая (Bicubic) и фильтр Ланцоша (Lanczos). Ниже представлены результаты их работы на примере увеличения разрешения картинки с 64х64 до 256х256.

Оригинал







Linear
Самый простой и, следовательно, самый быстрый способ изменить размеры изображения. Известен также как интерполяция методом ближайшего соседа (Nearest Neighbor). Для промежуточных пикселей выбирается ближайшее известное значение.



Bilinear
Для получения промежуточного значения производится линейная интерполяция между четырьмя ближайшими пикселями. Это позволяет несколько сгладить переходы. Билинейный фильтр - неплохой компромисс между скоростью и качеством результата.


Bicubic
Промежуточные значения вычисляются путем свертки ядра 4x4 специальной бикубической функцией. Достаточно медленный алгоритм, но зато дает наименее пикселизированный результат.


Lanczos
У бикубической интерполяции есть недостаток - изображение получается несколько размытым. Чтобы сохранить четкость, можно воспользоваться фильтром Ланцоша. Он немного увеличивает пикселизацию, но создает контрастные области вдоль контуров для повышения четкости. В моей реализации я использовал ядро 7х7. Очень медленно, зато качественно.


Существуют и другие алгоритмы - постепенно они тоже будут добавлены в библиотеку.
Изменения доступны в dlib ревизии r5 и выше.