2014/12/29
Android Wear 5.0 Watch Face API 対応と互換性
Android Wear 5.0 の新しい Witch Face API に載せ替えました。
・3D imclock for Android Wear
・Google play
Activity ではなく Service を使用しています。LiveWallpaper と同じです。
OpenGL 初期化や描画タイミング ( onTimeTick() ) の管理もほぼお任せで、
System UI, Card のレイアウトなどの設定も可能。
新しい API を使用したことで全体的にバッテリー消費量も減りました。
対応する描画モードは 4種類あります。
Protect/LowBit が有効かどうかはデバイス依存で onPropertiesChanged() によって判定します。
OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。
Watch Face 以外のアプリでは自分で Listener を登録できます。
Gles2WatchFaceService を使うと簡単に描画できる反面、EGL 初期化は
内部で行われており、任意の GLES Context を選べないなどいくつか制限も出てきます。
im-clock でもいくつか問題が生じていたので、LiveWallpaper のように
GLSurfaceView を使った方法も試しました。
最終的にはデバイス互換性を維持するのが難しくて断念。
結局 Gles2WatchFaceService を使い MSAA は自前で処理しています。
ChiRaKS for Android Wear では Moto 360 で画面が 90度回転してしまうとの報告を
かなり多数いただきました。
原因は Android 版で指定していた screenOrientation="portrait" が残っていたこと。
Moto 360 だけ画面が landscape 扱いとなっているようです。
ちなみに画面だけでなく使用している SoC も Moto 360 だけ異なります。
より詳しいスペック比較表は下記よりどうぞ
・Smart Watch のスペック比較
上記のように Moto 360 だけ 320x290 と画面が横長です。
ただしアプリケーションからは他のデバイス同様 320x320 の正方形画面に見えます。
OpenGL ES の場合どうやらデフォルトで設定されている Viewport でハードの違いを
吸収しているようです。
OpenGL は左下原点なので y に -30 のオフセットが入っています。
これを知らずに自分で Viewport を設定し (0,0,width,height) で上書きしていたため、
Moto 360 で動かした場合だけ描画が上に 30pix ずれていたことが後から判明しました。
互換性の対処のためにも日本で発売して欲しいデバイスです。
関連エントリ
・Android Wear Sony SmartWatch 3 SWR50 は速い
・Android Wear 3D のアナログ時計 (Watch Face)
・Android Wear にゲームを移植
・3D imclock for Android Wear
・Google play
Activity ではなく Service を使用しています。LiveWallpaper と同じです。
OpenGL 初期化や描画タイミング ( onTimeTick() ) の管理もほぼお任せで、
System UI, Card のレイアウトなどの設定も可能。
新しい API を使用したことで全体的にバッテリー消費量も減りました。
対応する描画モードは 4種類あります。
Interactive mode 通常の描画、秒針などアニメーション付き Ambient mode スリープ状態、1分に一度の描画更新 Protect mode Ambient mode 時に描画面積を最小に LowBit mode Ambient mode 時に白黒 2階調
Protect/LowBit が有効かどうかはデバイス依存で onPropertiesChanged() によって判定します。
// G2WatchService.java
@Override
public void onPropertiesChanged( Bundle properties )
{
super.onPropertiesChanged( properties );
boolean protect= properties.getBoolean( PROPERTY_BURN_IN_PROTECTION, false );
boolean lowbit= properties.getBoolean( PROPERTY_LOW_BIT_AMBIENT, false );
~
}
@Override
public void onPropertiesChanged( Bundle properties )
{
super.onPropertiesChanged( properties );
boolean protect= properties.getBoolean( PROPERTY_BURN_IN_PROTECTION, false );
boolean lowbit= properties.getBoolean( PROPERTY_LOW_BIT_AMBIENT, false );
~
}
OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。
// G2WatchService.java
@Override
public void onApplyWindowInsets( WindowInsets insets )
{
super.onApplyWindowInsets( insets );
boolean round_style= insets.isRound();
~
}
@Override
public void onApplyWindowInsets( WindowInsets insets )
{
super.onApplyWindowInsets( insets );
boolean round_style= insets.isRound();
~
}
Watch Face 以外のアプリでは自分で Listener を登録できます。
// GAScreen.java
public class GAScreenView extends GLSurfaceView
implements View.OnApplyWindowInsetsListener {
public GAScreenView( Context context ) {
super( context );
setOnApplyWindowInsetsListener( this );
}
~
}
public class GAScreenView extends GLSurfaceView
implements View.OnApplyWindowInsetsListener {
public GAScreenView( Context context ) {
super( context );
setOnApplyWindowInsetsListener( this );
}
~
}
Gles2WatchFaceService を使うと簡単に描画できる反面、EGL 初期化は
内部で行われており、任意の GLES Context を選べないなどいくつか制限も出てきます。
im-clock でもいくつか問題が生じていたので、LiveWallpaper のように
GLSurfaceView を使った方法も試しました。
最終的にはデバイス互換性を維持するのが難しくて断念。
結局 Gles2WatchFaceService を使い MSAA は自前で処理しています。
ChiRaKS for Android Wear では Moto 360 で画面が 90度回転してしまうとの報告を
かなり多数いただきました。
原因は Android 版で指定していた screenOrientation="portrait" が残っていたこと。
Moto 360 だけ画面が landscape 扱いとなっているようです。
ちなみに画面だけでなく使用している SoC も Moto 360 だけ異なります。
Device SoC GPU CPU -------------------------------------------------------------------- Moto 360 TI OMAP3630 PowerVR SGX530 Cortex-A8 LG G Watch 他 Snapdragon 400 Adreno 305 Cortex-A7 (1~4 core)
より詳しいスペック比較表は下記よりどうぞ
・Smart Watch のスペック比較
Device Display Viewport ----------------------------------------------------------- Moto 360 320x290 Landscape (0,-30,320,320) LG G Watch W100 280x280 Portrait (0,0,280,280) Galaxy Gear Live 320x320 Portrait (0,0,320,320) LG G Watch R W110 320x320 Portrait (0,0,320,320) SmartWatch SWR50 320x320 Portrait (0,0,320,320) ZenWatch WI500Q 320x320 Portrait (0,0,320,320)
上記のように Moto 360 だけ 320x290 と画面が横長です。
ただしアプリケーションからは他のデバイス同様 320x320 の正方形画面に見えます。
OpenGL ES の場合どうやらデフォルトで設定されている Viewport でハードの違いを
吸収しているようです。
OpenGL は左下原点なので y に -30 のオフセットが入っています。
これを知らずに自分で Viewport を設定し (0,0,width,height) で上書きしていたため、
Moto 360 で動かした場合だけ描画が上に 30pix ずれていたことが後から判明しました。
互換性の対処のためにも日本で発売して欲しいデバイスです。
関連エントリ
・Android Wear Sony SmartWatch 3 SWR50 は速い
・Android Wear 3D のアナログ時計 (Watch Face)
・Android Wear にゲームを移植
Nexus 6 の GPU Adreno 420 は OpenGL ES 3.1 AEP (Android Extension Pack)
に対応していることがわかりました。
OpenGL ES 3.1 は ComputeShader に対応しています。
OpenGL ES 3.1 AEP ではさらに Tessellator (HullShader/DomainShader,TCS/TES) や
GeometryShader など Direct3D 11 相当の機能が加わります。
これまでに判明した OpenGL ES 3.0 以上対応の GPU
Nexus 9 の Tegra K1 に続き、新型 Nexus はどちらも AEP に対応していることになります。
以下 Nexus 6 Snapdargon 805 APQ8084 の GL Extension
関連エントリ
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索
に対応していることがわかりました。
OpenGL ES 3.1 は ComputeShader に対応しています。
OpenGL ES 3.1 AEP ではさらに Tessellator (HullShader/DomainShader,TCS/TES) や
GeometryShader など Direct3D 11 相当の機能が加わります。
これまでに判明した OpenGL ES 3.0 以上対応の GPU
SoC GPU OpenGL ------------------------------------------------------------------ Kindle Fire HD6 MediaTek MT8135 PowerVR G6430 OpenGL ES 3.0 iPhone/iPad Apple A7/A8 PowerVR G6430 OpenGL ES 3.0 MeMO Pad ME176 BayTrail-T Z3745 HD Graphics OpenGL ES 3.0 LG G Watch W100 Snapdragon 400 Adreno 305 OpenGL ES 3.0 Nexus 7(2013) Snapdragon S4 Pro Adreno 320 OpenGL ES 3.0 Nexus 5 Snapdragon 800 Adreno 330 OpenGL ES 3.0 Nexus 10 Exynos 5 Dual Mali-T604 OpenGL ES 3.1 Nexus 6 Snapdragon 805 Adreno 420 OpenGL ES 3.1 AEP Nexus 9 NVIDIA Tegra K1 Kepler(192) OpenGL ES 3.1 AEP
Nexus 9 の Tegra K1 に続き、新型 Nexus はどちらも AEP に対応していることになります。
以下 Nexus 6 Snapdargon 805 APQ8084 の GL Extension
Extension: GL_EXT_debug_marker GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_KHR_texture_compression_astc_ldr GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_OES_element_index_uint GL_EXT_copy_image GL_EXT_geometry_shader GL_EXT_tessellation_shader GL_OES_texture_stencil8 GL_EXT_shader_io_blocks GL_OES_shader_image_atomic GL_OES_sample_variables GL_EXT_texture_border_clamp GL_EXT_multisampled_render_to_texture GL_OES_shader_multisample_interpolation GL_EXT_draw_buffers_indexed GL_EXT_gpu_shader5 GL_EXT_robustness GL_EXT_texture_buffer GL_OES_texture_storage_multisample_2d_array GL_OES_sample_shading GL_OES_get_program_binary GL_EXT_debug_label GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_QCOM_tiled_rendering GL_ANDROID_extension_pack_es31a GL_EXT_primitive_bounding_box GL_OES_standard_derivatives GL_OES_vertex_array_object GL_KHR_debug
関連エントリ
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索