Ugolnik's blog

Опубликовано: 01.09.2018

Набор полезных утилит Android-разработчика:

Launcher icons Action bar and tab icons Notification icons Generic icons Simple nine-patch generator Official Android Device Art Generator

http://romannurik.github.io/AndroidAssetStudio/

Написал 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.

Ничего лучше решения ниже мне найти не удалось:

template<typename T> T sign(T val) { return (val > 0) - (val < 0); }

Нашел у себя в файлопомойке свою первую демку для 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 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

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

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

Для “завершения” приложения на 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:

#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 }

Если во время отладки зависнет “ай”-девайс и перестанет реагировать на любые внешние воздействия, то перерзагрузить устройство можно удерживая кнопки Home и Power.

Симптомы такие: черный экран, горит подсветка, девайс не реагирует на нажатия кнопок, но iTunes его видит. Xcode ругается “process launch failed: launch or suspend in progress”.

rss