Archives

December 2014 の記事

Android Wear 5.0 の新しい Witch Face API に載せ替えました。

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 );
    ~
}

OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。

// G2WatchService.java
@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 );
    }
    ~
}

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

                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 で記事検索


Sony SmartWatch3 の vfpbench スコアを送っていただきました。
LG G Watch (LG-W100) よりも速く、実際に 1.2GHz 出ているものと思われます。
またきちんと確認していませんが 2 core 生きている可能性もあります。

// SmartWatch 3 SWR50
// MSM8226 Cortex-A7 1.2GHz x4 (1.2GHz x2?)

ARCH: ARMv7A
CPU core: 4
VFP: VFPv4-D32 NEON
FMA: Yes
NEON: Yes
Result
  SingleT SP max:  2.257 GFLOPS
  SingleT DP max:  1.144 GFLOPS
  MultiT  SP max:  4.946 GFLOPS
  MultiT  DP max:  2.278 GFLOPS

Motorola Moto 360 以外はどれも同じ Snapdragon 400 (MSM8226) の
横並びですが、予想外に違いがあるようです。

device                SoC             CPU       SoCのspec   実質
----------------------------------------------------------------------
LG G Watch   LG-W100  Snapdragon 400  Cortex-A7 1.2GHz x4   0.8GHz x1
LG G Watch R LG-W110  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
Galaxy Gear Live      Snapdragon 400  Cortex-A7 1.2GHz x4   ?
ASUS ZenWatch WI500Q  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
SmartWatch 3 SWR50    Snapdragon 400  Cortex-A7 1.2GHz x4   1.2GHz x2?
Motolora Moto 360     TI OMAP3630     Cortex-A8 1.0GHz x1   1.0GHz x1

同様に Motorola Moto 360 の結果も頂いたので下記にまとめます。
スコアから見てこちらは Cortex-A8 の 1.0GHz で動いているものと見られます。

device (4.4W.2)       SP-ST   DP-ST   SP-MT   DP-MT
-----------------------------------------------------------
LG G Watch LG-W100    1.419   0.742   1.367   0.676  GFLOPS
SmartWatch 3 SWR50    2.257   1.144   4.946   2.278  GFLOPS
Motolora Moto 360     3.739   0.126   3.376   0.125  GFLOPS

  * SP=単精度, DP=倍精度, ST=SingleThread, MT=MultiThread

一見 Moto 360 が一番速いようにみえるかもしれません。
ピーク値で突出しているのは Cortex-A8 が 64bit 幅の NEON ALU を
持っているからです。(Cortex-A7 は 32bit幅)

実際は世代の古い SoC を採用しており Moto360 の CPU Core も数世代前のものです。
倍精度(DP)の結果を見てわかるように、VFP 演算では他の CPU の 1/5 以下の速度となります。
浮動小数点演算を多用している一般的なアプリケーション (NEON未使用) では
おそらく Moto 360 の方が低速でしょう。
この辺りは VFP Bencmark で命令毎の数値を比較するとよくわかります。

詳しいログを下記ページに追加しました

VFP Benchmark Log

もし他のデバイスのログをお持ちの方がいましたらぜひ送ってください。


関連エントリ
Android Wear VFP Benchmark
ndroid Wear LG G Watch (LG-W100) の速度(実測)