Slide 1

Slide 1 text

EXTENDED A Study in Bitmap: Is NDK the Fastest Processing Method by CPU? キクチコウダイ

Slide 2

Slide 2 text

自己紹介 菊池 広大(キクチコウダイ) 2023年6月 株式会社マネーフォワードに入社 埼玉出身、Iターンで東京から福岡に引越し Androidエンジニア、たまにバックエンド Github: https://github.com/BigBackBoom

Slide 3

Slide 3 text

WE ARE HIRING!!!!

Slide 4

Slide 4 text

概要 以前、モバチキで発表したものに 内容を肉付けしたものとなっています。

Slide 5

Slide 5 text

おさらい

Slide 6

Slide 6 text

概要 C++で実行されるAndroidのNDKは 本当に実行速度最速なのか? Bitmapファイルを処理して その速度を検証してみよう

Slide 7

Slide 7 text

NDKとは?

Slide 8

Slide 8 text

NDKとは? ● Kotlin/JavaからC/C++などのNativeコードでの開発 が可能にするツールセット ● C/C++でしか提供されていないパワフルなライブラリ が利用可能になる ● Nativeコードのロジックを再利用できる。

Slide 9

Slide 9 text

検証内容

Slide 10

Slide 10 text

検証内容 4KのBMPファイルを アルファブレンディングして 処理時間を測る

Slide 11

Slide 11 text

パフォーマンス

Slide 12

Slide 12 text

パフォーマンス

Slide 13

Slide 13 text

パフォーマンス NDK: ● Average: 50ms ● Max: 75ms ● Min: 33ms ● Median: 45.5ms JVM: ● Average: 63.3ms ● Max: 90ms ● Min: 59ms ● Median: 60ms まとめ

Slide 14

Slide 14 text

結論 ● NDKだから早いとは限らない ● ただ、ハードウェアアクセラレーションを利用すれば最強! ● とはいえ、【パフォーマンスチューニング】は大事だが、ゲームアプリ のフレームレート改善でもない限り、msレベルのチューニングは無駄

Slide 15

Slide 15 text

EXTENDED!

Slide 16

Slide 16 text

Extended なんでJVMとネイティブコードで そんなに処理速度に差が出てないの?

Slide 17

Slide 17 text

Extended JavaはJust in Time(JIT)コンパイラーを 内部的に利用しているため 実行直前にネイティブコードを生成している。

Slide 18

Slide 18 text

Extended ハードウェアアクセラレーションでの処理は 果たして高速なのだろうか? OpenGL© ESで試してみた

Slide 19

Slide 19 text

Extended ● クロスプラットフォームで動作するグラフィックライ ブラリ。 ● 実装難易度は高いが、最高レベルのパフォーマンスで 描画可能 ● Androidの描画ライブラリSkiaも裏はこいつ

Slide 20

Slide 20 text

Extended OpenGLのテクスチャに画像を貼り付けて シェーダーで高速 ブレンディング処理を実施する

Slide 21

Slide 21 text

Extended ● テクスチャの色データを取 り出す GLSLの実装 #version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D s_texture; uniform vec3 rgb; uniform float alpha; void main() { // change color order since bitmap is BGR float filtering = 1.0 - alpha; vec4 texture = texture(s_texture , v_texCoord); float r = (texture.b * alpha) + (rgb.r * filtering) ; float g = (texture.g * alpha) + (rgb.g * filtering) ; float b = (texture.r * alpha) + (rgb.b * filtering) ; // change color order since bitmap is BGR outColor = vec4(r, g, b, 1.0f); }

Slide 22

Slide 22 text

Extended ● テクスチャの色データを取 り出す ● 取り出したデータでブレン ディング処理をする GLSLの実装 #version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D s_texture; uniform vec3 rgb; uniform float alpha; void main() { // change color order since bitmap is BGR float filtering = 1.0 - alpha; vec4 texture = texture(s_texture , v_texCoord); float r = (texture.b * alpha) + (rgb.r * filtering) ; float g = (texture.g * alpha) + (rgb.g * filtering) ; float b = (texture.r * alpha) + (rgb.b * filtering) ; // change color order since bitmap is BGR outColor = vec4(r, g, b, 1.0f); }

Slide 23

Slide 23 text

Extended ● テクスチャの色データを取 り出す ● 取り出したデータでブレン ディング処理をする ● 普通のプログラミング言語 に近いが、if文を使うと劇 的に遅くなる😂 GLSLの実装 #version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D s_texture; uniform vec3 rgb; uniform float alpha; void main() { // change color order since bitmap is BGR float filtering = 1.0 - alpha; vec4 texture = texture(s_texture , v_texCoord); float r = (texture.b * alpha) + (rgb.r * filtering) ; float g = (texture.g * alpha) + (rgb.g * filtering) ; float b = (texture.r * alpha) + (rgb.b * filtering) ; // change color order since bitmap is BGR outColor = vec4(r, g, b, 1.0f); }

Slide 24

Slide 24 text

Extended

Slide 25

Slide 25 text

結論

Slide 26

Slide 26 text

結論 俺たちのGPUは最強なんだ!

Slide 27

Slide 27 text

結論 ● Javaも実は実処理はネイティブコード ● GPUを使った処理はやっぱり早い。

Slide 28

Slide 28 text

以上、ありがとうございました!

Slide 29

Slide 29 text

Sample Repository: ❖ Kotlin 2.0 ❖ Multi-Module with NDK ❖ Jetpack Compose https://github.com/BigBackBoom/hades