Archive for the ‘Новости’ Category

It works fast with huge data. 17Mb/s parsing speed and it was tested with 2Gigs of data (requires about 15Gb of RAM)

It works fast with huge data. 17Mb/s parsing speed, and it was tested with about 500Megs of data.

В Linux имеется достаточно большое количество средств для профилирования приложений, наиболее распространенными из них являют valgrind, gprof и oprofile. В valgrind имеется инструмент callgrind, который позволяет собирать статистику по вызовам различных функций. Для анализа результатов есть замечательное приложение — kcachegrind, позволяющее достаточно удобно просматривать узкие места, находить пути, по которым код приходит в эти места.

Это замечательный утилиты, которые позволяют найти узкие места в коде, однако у использования данных утилит есть несколько минусов:

  • Valgrind значительно понижает скорость выполнения программы
  • Во всех данных утилитах отсутствует возможность посмотреть изменение выполнения кусков кода во времени
  • Нет возможности посмотреть не функцию целиком или отдельную строку, а логический модуль.

Эти особенности общие для всех утилит профайлинга, не требующих изменения исходного кода приложения. Под Linux есть некоторое количество профайлеров, требующих изменения исходного кода, однако мне не удалось найти функционального GUI приложения для просмотра этих данных. Единственное исключение это Telemetry от RadGame tools, но данная утилита не бесплатна.

Не так давно у меня возникла необходимость проверить как работает мой 3D движок и посмотрев на варианты я решил что нужно сделать свое средство, отвечающие минимальному набору требований:

  • Максимально быстрая генерация профилировочных данных — мне нужно смотреть на достаточно быстрые процессы
  • Максимально простой формат выходных данных
  • Возможность профилирования много-поточных приложений
  • Минимально возможное использование Linux-specific кода

В результате был написан cppprofiler, работающий исключительно с испльзованием функционала c++11.

Внутреннее устройство

cppprofiler активно использует функционал из стандарта C++11:

  • Thread-local storage
  • std::chrono
  • std::thread

На данный момент весь требуемый функционал поддерживает gcc-4.8 и последняя версия clang-3.3. В теории выкинув thread-local можно собрать однопоточную версию используя VS2012, но Microsoft в std::chrono в качестве high_resolution_clock использует крайне не точный таймер.

Внешний интерфейс

Фактически весь интерфейс состоит из двух статических функций:

  • startModule(const char *module_name) — открывает модуль профилирования. Допускается открытие вложенных модулей
  • endModule() — закрывает модуль профилирования

Для упрощения жизни имеются вспомогательные макросы:

  • PROFILE_START(name) — аналогичен вызову startModule
  • PROFILE_END — аналогичен вызову endModule
  • PROFILE_FUNCTION — создает вспомогательный класс ProfileHelper и передает туда имя функции (__FUNCTION__)

Также есть вспомогательный класс, реализующий идиому RAII — ProfileHelper. В конструкторе он вызывает startModule а в деструкторе — endModule

Настойки

Профайлер обладает минимальным размером настроек, реализованных с помощью директив препроцессора:

  • PROFILING_CACHE_SIZE — размер кеша для профилировочных данных. Данные скидываются на диск только по заполнению кеша либо при завершении работы
  • PROFILING_FILENAME_PREFIX — префикс который будет писаться к именам файлов. Имя файла для вывода информации формируется по следующему правилу: $PROFILING_FILENAME_PREFIX_$TIMESTAMP_$THREADID.cppprof
  • ENABLE_PROFILING — включает вывод профилировочных данных с помощью макросов. Если данная директива не установлена профайлер всеравно будет работать при прямых вызовах либо при использовании ProfileHelper

Особенности реализации

Performance of the libcppprofiler it self - about 150ns

Performance of the libcppprofiler it self — about 150ns on i7

Как уже говорилось выше — основное требование к данному профайлеру — скорость работы. Для увеличения скорости работы были применены следующие меры:

  • Вся профилировочная информация сохраняется во временном буфере, сброс которого происходит в одном из трех случаев:
    • Закончилось место в буфере
    • Завершается работа приложения
    • Вызван метод flushProfiling
  • Для сохранения данных используется сплошной массив (char*), в который данные пишутся последовательно. Невозможно извлечь записанные ранее данные.
  • Расчеты внутри профайлера сведены к минимуму, поэтому в данные записываются timestamp в наносекундах
  • Для определения времени, потраченного на внутренние нужды профайлера, выводятся внутренние времена на выполнение все операций
  • Профайлер использует thread-local storage чтобы избежать использование примитивов синхронизации. В TLS хранится инстанс профайлера для треда и время старта треда

Использование std::chrono достаточно спорное решение в случае с профайлером. С одной стороны это в теории кросс-платформенное решение позволяющее добиться высокой точности в измерениях времени, но с другой стороны — стоимость получения времени средствами std::chrono несколько выше использования платформо-специфичных средств. (например использование clock_gettime под linux позволяет уменьшить время работы профайлера примерно на 30%)

Точность std::chrono высока на большинстве платформ, так на gcc-4.8 она достигает 1 нс на Intel Core I7 и в районе 10-50 нс на различных процессорах AMD. Даже в среде VirtualBox точность не превышает 1мкс. Но под VS2013 она может составлять 500мкс, что уже не приемлемо.

Где взять это чудо?

Это чудо можно взять здесь:

  • GitWeb
  • GitHub
  • Или скачать с помощью Git: git clone git://developer.nsws.ru/libcppprofiler.git или git clone https://github.com/Kvalme/libcppprofiler.git

Для сборки потребуется:

  • gcc-4.8 (или можно вручную настроить сборку с помощью clang-3.3)
  • QT-5.0 для сборки UI

Бинарную версию можно взять тут: libcppprofiler.tar.bz2 (260Kb)

Тестовые данные для нее можно либо сгенерировать с помощью perftest либо с скачать: TestData (18Mb)

Ну и на последок несколько скриншотов, чтобы можно было лучше оценить возможности приложения:

 

Завершена работа над новой версией генератора процедурных текстур. Это промежуточная версия, с некоторым nice-to-have функционалом, не вносящая ничего принципиально нового (0.1.5). Основной задачей, которая ставилась на эту версию была стабилизация работы на различных OpenCL платформах. Новая версия умеет работать как на Nvidia (основная платформа разработки) так и на AMD(и видеокарты и цпу) и Intel(цпу). Более того, удалось успешно запустить на достаточно разных платформах:

Ubuntu 12.10 x64 — проверено Nvidia OpenCL и Intel OpenCL SDK. (GTX570, i7-3820)

Mageia2 x64 — проверялось в KVM. Работает с Intel OpenCL SDK

Wine-1.5.24 — работает послу установки AMD APP SDK

Win7 x64 — Nvidia OpenCL (GTX 260), AMD APP SDK (Radeon 7950)

Плюс к этому я сильно задолбался запоминать что надо сделать, что не работает и т.д., посему проект обзавелся своим багтрэкером на котором можно всегда посмотреть текущий прогресс и планы на будущее которые конечно могут меняться.

Список изменений libclnoise.

— 0000003: [Feature] Работа с внешним OpenCL контекстом
— 0000013: [Feature] Поддержка gcc-4.6 (Messenger)
— 0000014: [Bug] Ошибка компиляции OpenCL на AMD картах (Messenger)
— 0000017: [Bug] Unable to build with intel-ocl-sdk

Список изменений NoiseTextureGenerator.

— 0000005: [Feature] Интерфейс для указания OpenCL параметров
— 0000006: [Bug] Не запускается на Mageia linux
— 0000010: [Feature] Экспорт в JPG

Ссылки.

В git по старому адресу (tag 0.1.5)

Win32

Ubuntu 12.10 (x64)

А еще любопытные могут скачать исходник, с которого была получена картинка, расположенная в начале этой статьи.

libclnoise-0.1.0

Генератор процедурных текстур, а вместе с ним и библиотека по генерации процедурного шума получила первую версию — «0.1.0». За время работы над этой версией произошли разные события, как приятные так и не очень. Например из приятных — я обзавелся 27-ми дюймовым монитором DELL 2711 и теперь картинки отображаются намного лучше и в большем разрешении, а из приятных — версия задержалась из-за скоропостижной кончины материнки (gigabyte GA-X79-UD5). Но все позади и теперь можно продолжать работать над новыми версиями. Кстати картинка слева — это RidgedMulti полученный в новой версии.

Что же такого нового в этой версии, что  она удостоилась номера версии?

Список изменений libclnoise.

Добавлены новые модули для генерации шума: Billow, Checkerboard, Const, Cylinders, Perlin, RidgedMulti, Voronoi.

Добавлены модули для обработки шума: abs, abs_diff, add_sat, clamp, max, min, mix, smoothstep, sub_sat.

Реализован боле-менее человеческий кодогенератор, который позволяет динамически менять параметры всех модулей без пересборки карты шумов, что значительно ускоряет работу при постоянном изменении аттрибутов.

Список изменений NoiseTextureGenerator.

Переделан интерфейс пользователя — надеюсь он стал понятней. Для добавления модуля надо сделать даблклик на его имени в списке справа.

После перехода на новую версию libclnoise удалось достич гораздо большей скорости работы. Все модули спокойно отрабатывают за 30мс при размере текстуры 4096*4096 (ПЕЧ570). RidgedMulti при разрешении 1024*1024 занимает 9мс на ПЕЧ260.

Известные баги

Ну а куда без известных багов?

Если удалить модуль, к которому присоединена хотя бы одна стрелка — приложение упадет. Надо сперва удалить все стрелки и только потом удалять модуль.

add_sat и sub_sat могут не работать. Непонятные ошибки от OpenCL компилятора вылетают.

А что будет дальше?

А дальше будет вот что. В ближайшее время я планирую сделать интерфейс для модулей расцветки и реализовать таки многострадальный градиент, чтобы картинки стали еще красивее, далее надо реализовать возможность играться с координатами, а то сейчас нельзя сделать различные инетерсные модификаторы, к примеру turbulence. А после всего этого планируется дать возможность создавать кастомные модули на OpenCL.

А где взять такую замечательную тулзу?

А тулза такая живет в git по старому адресу (см. прошлый пост), а бинарные сборки можно взять тут:

А еще любопытные могут скачать исходник, с которого была получена картинка, расположенная в начале этой статьи.

Выложил обновление для генератора процедурных текстур. Посмотрев на скорость работы libnoise решился таки начать портирование данной библиотеки на OpenCL. В данной версии используется библиотека libclnoise. Конечно портирование еще только в процессе и много функционала отсуствует (на самом деле есть только один вид шума — Perlin и один вид вывод — PlaneMap, такчто это скорее можно рассматривать как proof of concept)

Сама тулза переписана почти на 90%, как из-за новой билиотеки так и из-за кривизны предыдущей реализации.

Реализованный функционал

NoiseTextureGenerator

  • Построение схемы генерации.
  • Сохранение и загрузка схемы.
  • Экспорт схемы.
  • Соединение по контактам (перетаскиваем источник на получатель — получаем связь).
  • Автообновление предпросмотра текстуры.
  • Сохранение текстуры в файл.
  • Редактирование свойств модулей.

libclnoise

  • Построение схемы.
  • Установка параметров модулей
  • Инициализация OpenCL контекста.
  • Построение кода OpenCL ядра для выполнения.
  • Выполнение OpenCL ядра и получение результата.

Планируемый функционал

NoiseTextureGenerator

  • Автоматический предпросмотр.
  • Предпросмотр текстуры в OpenGL режиме, с различными примитивами.
  • User-defined модули.

libclnoise

  • Портирование всех модулей из libnoise в libclnoise.
  • Улучшенный генератор кода.
  • Поддерка user-defined модулей.
  • Поддержка типов выходов/входов модуля.
  • Дополнительные модули: colorer, source from image, scale

Сборка из исходных кодов

Для сборки NoiseTextureGenerator из исходных кодов теперь необходимо немного шаманства. Для начала надо получить исходные коды как генератора так и библиотеки libclnoise:

git clone git://developer.nsws.ru/NoiseTextureGenerator.git
cd NoiseTextureGenerator/NoiseTextureGenerator
git clone git://developer.nsws.ru/libclnoise.git

Далее необходимо сгенерировать код модулей для билиотеки:

cd libclnoise/src/modules/
./cl2h.sh

Теперь можно использовать qmake или qtcreator. Сборка проверялась на gcc-4.7. Гарантированно собрать срествами VS2010 не получится т.к. используется for по коллекции, который не реализован в VS2010

Бинарные версии

32-х битная версия под Ubuntu не была обновлена, надо разобраться с кросс компиляцией.

Для работы любой версии потребуется установленный OpenCL runtime (поидее должен быть установлен если у вас достаточно свежие драйвера)

Ожидаемая обратная связь

Очень хочется узнать, запустилось ли у вас без бубна, удалось ли сгенерировать текстуру? Это мой первый опыт в использовании OpenCL поэтому могут быть разные баги.

Около года назад я заинтересовался генерацией процедурных текстур, в частности для генерации поверхностей планет. Посмотрев на то что можно получить из простенького генератора, встроенного в Terragen я решил написать себе тулзу, в которой можно бы было настраивать параметры в более удобном виде с возможностью экспортировать описание шума в xml файл, с целью его последующей загрузки.

Данный генератор текстур фактически является GUI приложением для библиотеки libnoise и предоставляет возможность построения схемы из большей части модулей этой библиотеки. Для обеспечения возможности использования схемы в других приложения можно произвести экспорт данных в xml файл. Пример его загрузки можно посмотреть в исходных кодах (Generation/noisexmlbuilder.{h,cpp})

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

Выглядит программа примерно так: превью

Бинарные сборки:

Версия под win32 не тестировалась. Известно только что она запускается под wine.

Исходники:

git clone git://developer.nsws.ru/NoiseTextureGenerator.git

Сразу хочу сказать что исходники ужасны 🙂

Ну во первых всех с наступающим Новым Годом!

А во вторых хочу поделиться проектом, который планировался к запуску в прошлом году, но так и небыл реализован и теперь уже врятли когда нибудь будет. Проект задумывался как забавный Tower Defence новогодней тематики, к нему уже есть проработанный документ, который впринципе был интересен компании, в которой я на тот момент работал, но оказалось что он слишком большой и запускать его не рискнули. Позже я подумывал начать этот проект в свободное время, но мой интерес перешел в область 3д графики и проект заглох.

Дизайн документ: http://blog.nsws.ru/wp-upload/ssg.pdf

Врятли этому проекту суждено увидеть свет, но вдруг кого-то заинтересует 🙂

Всех с наступающим!

Сегодня замечательный праздник, наверное один из главных праздников года, и в этот замечательный день грех не сделать космического релиза.

Давным давно, когда самым мощным компьютером у нас дома был калькулятор, в далекие 90-е годы, моим братом (с небольшим моим участием) была придумана и реализована игра «Космос».

«Космос» — игра для 2-12 игроков в возрасте от 10 до 999 лет, развивающая стратегическое мышление, математические способности и моторику запястья. Один сеанс игры занимает от 20 минут до 20 часов, что делает ее идеальной для любой компании. Сегодня я публикую то, что не видел никто кроме круга нашей семьи — оригинальные правила, которые должны были пойти в печать. На самом деле данные правила нельзя в полной мере назвать оригинальными. Это именно те правила которые готовились для издательства в Новосибирске, но в последний момент издатель передумал. В оригинале были еще дополнения по созданию уникальных дизайнов кораблей и пиратам, но отбалансировать их не удалось, и после нескольких тестовых игр правила были исключены.

Карта игры

Правила игры

Еще раз поздравляю всех с праздником! Чистого неба!

13
Май

Дальнейшие планы

   Posted by: admin Tags:

Уже прошло довольно много времени, с момента выпуска моей аркады, я сменил работу и занимаюсь теперь разработкой игр не только как хобби но и как основной доход, но все же надо двигаться дальше и разрабатывать свои игры.

Итак, что ждет нас в будущем.

В ближайшее время у меня в планах разобраться таки с проектом CrazyStones и довести его до играбельного состояния, что потребует некоторых работ над MagicEngine, которые были уже давно нужны но руки до них никак не доходили. На доработку CrazyStones пока что планируется потратить пару месяцев, включая разработку редактора уровней, разработку самих уровней и реализацию геймплея.

Для движка планируется приделать человеческий рендеринг текста, поддержку разных разрешений  с адекватным зумом(а то сейчас оно так страшненько выглядит:) )  и, возможно, поддержку mng файлов для анимации.

После этого в планах стоит портировать движок под MacOS, с целью более полного охвата всех возможных конфигураций, а так же, в случае возможности, и портирование под iPhone и Android.

Ну а дальше надо делать NYP2012, дизайн документ на который в объеме 20-ти страниц текста уже готов!

Если будут желающие присоединиться к любому из этих этапов — пишите, всегда рад слышать ваши пожелания и предложения.

В прошлую пятницу у меня возникла идея сделать Match-3 с «реальной» физикой. Сегодня я представляю концепт версию данной игры. Багов много, но в целом основная идея уже именно та что и должна быть. Read the rest of this entry »

7
Дек

NYP2011 закрыт

   Posted by: admin Tags:

С прискорбием сообщаю что проект NYP2011 пал смертью храбрых в неравной борьбе с моей ленью. Это значит что  NYP2011 не увидит свет. Причиной этому послужила невозможность на данном этапе реализовать проект в том виде, в котором я хочу его видеть, в силу как проблем со временем (да, в еву полетать хочется больше чем делать NYP) так и с желанием)

Вообще лучшим NYP из когдалибо выходивших я считаю NYP2009, который, как и остальные версии NYP можно скачать тут:  http://nsws.ru/node/20

На данный момент я не знаю, будет ли запущен какой либо другой проект, поживем увидим…