• Way of Tanks

    Way of Tanks

    Way of Tanks – это танковый ранер с бесконечным геймплеем и разнообразной трассой. Игрок свайпами

    Read more »
  • Road Fighter

    Road Fighter

    Road Fighter — видеоигра в жанре аркадных автогонок, разработанная компанией Konami и выпущенная в виде

    Read more »
  • ZX-Spectrum 48k

    Неизвестный Синклер

    Весьма занимательное чтиво об истории становления компьютера ZX-Spectrum, Клайве Синклере и компании Sinclair Research. Цветной,

    Read more »
  • King Valley

    King’s Valley на ZX-Spectrum

    Моя версия игры King’s Valley для ZX-Spectrum, которую я написал еще в школьные годы, аккурат

    Read more »
  • YouCompleteMe in action

    Рандомные тормоза Vim с плагином YouCompleteMe

    Пользуюсь для C/C++ комплитером YouCompleteMe, базирующемся на clang. Периодически YCM тормозил так сильно, что ввод

    Read more »
  • Simple Viewer GL

    Simple Viewer GL

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

    Read more »
  • Rubik's Stopwatch

    Rubik’s cube Stop-watch

    Таймер для учёта времени сборки кубика Рубика и прочих головоломок. Более подробно о возможностях таймера

    Read more »

GLSL: Clock style bar

Clock (GLSL) Написал GLES шейдер, который имитирует круговое заполнение энергии (прогресса, маны, etc.). Код шейдера и демонстрация работы доступна на сайте ShaderToy.

#define M_PI 3.1415926535897932384626433832795

vec4 col = vec4(0.0, 0.0, 0.0, 0.0);

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float angle = mod(iGlobalTime, M_PI * 2.0);

    vec2 p = (iResolution.xy - 2.0 * fragCoord.xy) / iResolution.y;

    float q = atan(-p.x, p.y);
    float f = step(0.0, cos((q + angle) * 0.5));

    // mix with texture
    vec2 uv = fragCoord.xy / iResolution.xy;
    vec4 tc = texture2D(iChannel0, uv);
    fragColor = mix(tc, col, f);
}

Время в миллисекундах

Возвращает использование времени в миллисекундах для вызвавшего процесса и всех его нитей:

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

int getCpuTime()
{
  struct rusage rus;
  getrusage(0, &rus);
  return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
}

Подробности в man getrusage.

Boot Demo

Boot Demo Нашел у себя в файлопомойке свою первую демку для x86 от 1997 года. Помню, что эта демка была написана вначале на Си и на i386 SX она жестоко тормозила. Тогда я переписал ее на ассемблере (это был мой первый опыт программирования на ассемблере для x86). И она шустро работала на всем том говне, которое можно было найти в то время.

С помощью утилиты Demoinst (автор Алексей Шаблюк) демка записывалась в свободные сектора на HDD и устанавливался бут, который ее запускал. После включения и инициализации компьютера запускалась эта демка, а по нажатию на любой клавиши запускался оригинальный загрузчик. Тогда это казалось прикольно :)

Запустить демку удалось только под DosBox. При запуске в DosEmu эмулятор крешится (Fault out of DOSEMU code, cs:eip=33:4a5563, cr2=11cf, fault_cnt=1). В демке нет поддержки v-sync, поэтому она в эмуляторе мерцает.

p.s. Сейчас для меня кажется странным, что такое простое приложение на Си могло быть таким тормозным. Вероятно мой Си-кунг-фу был низкого уровня.

Android: скриншот с помощью adb

На девайсе под управлением Android сделать скриншот статического (!) изображения можно скопировав информацию из фреймбуфера:

adb pull /dev/graphics/fb0 fb.bgra

Расширение bgra нужно для convert из набора ImageMagick, что бы он мог понять каков порядок ARGB. Я пробовал снимать скриншоты на девайсе от Sony, там порядок был BGRA. Возможно он таков на всех устройствах.

В цикле снимать скриншоты можно так:

while [ 1 ] ; do adb pull /dev/graphics/fb0 fb-`date +"%H-%M-%S"`.bgra ; sleep 1 ; done

Конвертация:

convert -size 480x854 -depth 8 fb-*.bgra screenshot-%05d.png

iOS: Invalid Image Path

Вот с такой “CFBundleIcons: AppIcon 120×120 not found” ошибкой столкнулся сегодня при попытке выгрузить новую версию игры в AppStore. Проблема была в “а возьму-ка я этот iconset-темплейт и с его помощью нагенерю иконки”. Темплейт хороший, умеет все нужные иконки. И даже на одну больше, чем мне нужно. Вот из-за нее и была проблема.

Решается просто. В Project navigator кликаем на ресурс Images.xcassets, выбираем AppIcon, удаляем иконку из слота CarPlay iOS 8 120pt. Все, проблема решена.

Android: завершение приложения

Для “завершения” приложения на Android я раньше делал finish() из Activity и exit() из NDK.
Это далеко не лучший, хотя и кардинально чистящий вариант.

После некоторых раздумий решил завершать apploop и дергать из Activity “хоум скрин”:

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startMain);

iOS: определение версии ОС

Эти макросы позволяют без усилий и лишнего кода определять версию iOS:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Использовать можно так:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    // iOS 7.0+ specific code
}

Этот способ лучше способа с float, поскольку с его помощью можно детектить и вот такой формат 6.1.3.

if([[[UIDevice currentDevice] systemVersion] floatValue] > 6.13)
{
    // iOS 6.13
}
1 2 3 4 70