Posts Tagged ‘Проекты’

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)

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

 

Tags: , ,

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

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

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

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

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

Tags: ,

13
Май

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

   Posted by: admin    in Новости

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

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

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

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

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

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

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

Tags:

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

Tags:

12
Окт

Space_Arcade 1.1.0

   Posted by: admin    in OpenGL, Space Arcade, Новости

Сегодня, 12 октября 2010 года, вышел первый и последний патч для space_arcade. Разработка проекта завершена.

Данная версия игры распространяется в двух видах: исходные коды для Linux систем и бинарный пакет для Windows.

Огромная просьба сообщать если у вас не запустилось, совместно с конфигурацией оборудования (dxdiag->сохранить отчет,  либо указывать  CPU, OS, модель видеокарты, версию видео драйвера). Read the rest of this entry »

Tags: ,

27
Июл

SpaceArcade: танцы на костях

   Posted by: admin    in Space Arcade, Новости

История проекта началась 1 июня 2008 года, когда я решил что пора наконец-то доделать до играбельного состояния хотябы один из этих своих проектов. Несмотря на то что проект забрасывался несколько раз (в сентябре 2008 по февраль 2009, с марта по июль 2009, с августа 2009 по август 2010) он всеже смог получить цифру 1.0.0 в номере версии.

Read the rest of this entry »

Tags: ,

2
Июн

Space arcade

   Posted by: admin    in MagicEngine, Space Arcade, Новости

Спустя большой период времени после версии 0.5.0.3 я наконец-то возобновил над этим проектом. На данный момент проект готовится к релизу. За прошедшее время было сделано достаточно многое. Read the rest of this entry »

Tags: ,

29
Дек

С Новым Годом

   Posted by: admin    in MagicEngine, NYP, OpenGL, Новости

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

Всех с Новым  Годом! Read the rest of this entry »

Tags: , ,

3
Ноя

Последние новости

   Posted by: admin    in Новости

Несмотря на царящую здесь тишину работы по прежнему продолжаются.

SpaceArcade находится в стадии ожидания анимации от художника а тем временем я занялся написанием ежегодной новогодней демки. На этот раз  демоверсия выйдет в 3D варианте и, к сожалению, запустится далеко не у всех. Обязательным требованием, скорее всего, будет наличие видеокарты, поддерживающей OpenGL3.0, т.к. используемый графический движок рассчитан именно на эту версию OpenGL и я неуверен что решусь исправить его специально для данной демки.

Tags:

20
Май

Прогресс в работах

   Posted by: admin    in Новости

Давно я не писал сюда никаких записей и можно подумать что все это уже загнулось, однако это не так.
Во-первых, работы над so_arcade заморожены в ожидании арта от художника.
Во-вторых, начаты работы над 3д аркадой, релиз которой намечен на август.
В-третьих, я начал изучать OpenGL глубже, в связи с работами над 3д аркадой, и в скоре должны появвиться первые результаты.
В качестве основных интересов на текущий момент выбрано изучение OpenGL3.1 и соответственно GLSL1.40, жаль только что дров с поддержкой данной функциональности на данный момент еще нет. Учитывая что очень хочется заюзать ряд фич которые появились в OpenGL3.1, а точнее glDrawArraysIndexed, врятли следующий проект запустится на чемто слабее чем GF8, однако учитывая распространенность данной серии ориентироваться на чтото более слабое нет особенного желания.
О новом проекте я покачто говорить не буду, чтобы не сглазить, скажу лишь что планируется достаточно простая игрушка в 3Д пространстве.

Tags: ,