SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Gingerbread以降のNDK
 ゲーム開発のTipsなど
 Google IO 報告会 発表資料
       @cat_kaotaro
自己紹介
• @cat_kaotaro こと はしづめかおり と申します
• 2009年の秋くらいからAndroidのおっかけしています
• 「Okusama」というアプリつくってます
• 会社ではAndroid技術者養成のための研修講師やお助け
  マンやってます
• ACE(Androidアプリケーション技術者認定試験)の対策本
  の執筆
    – ベーシック対策実践問題集 (日経BP)2010年11月発売
    – 徹底攻略ACE問題集(インプレスジャパン)2011年6月発売予定
Bringing C and C++ Games to Android

Dan Galpin 氏
Ian Ni-Lewis 氏
冒頭でJavaの駄目だし
•   ほとんどの人がJava以外の言語がすきなんじゃないか
•   Javaはすべてにおいて万能ではない
•   ゲームはハイパフォーマンスが求められる
•   C/C++の開発はNDKでやろう
     –   既存のネイティブライブラリの再利用
     –   サブルーチンの高速化
     –   VFP (Vector Floating Point 浮動小数点演算機能)、NEONアクセス
     –   かといって絶対速くなるわけではないんだからね
•   NDK?
     – ツールチェイン(標準的なgccのクロスコンパイラ)
     – Android 用のプラットフォームビルドシステム
     – ヘッダとライブラリ(C,C++のランタイムなど)
•   Stable ABI(Application Binary interface) - armeabi
     – 移植したいライブラリがAndroidプラットフォームが持つシステムライブラ
       リでは使用できないかも
最近のNDKのトピック
• FroyoではJNI Graphicsがサポート
  (libjnigraphics)
• Gingerbreadではゲーム開発用に以下のライ
  ブラリが追加された
 – EGL(libEGL)
 – OpenSL ES(libOpenSLES)
 – Native framework/Native Activity(libandroid)
NDKのセットアップ・開発手順
• 現在-r5b
• Android DevelopersとかNDK内のドキュメン
  トに詳しく書いてある
• Application.mkに
         APP_STL:=gnustl_static
  を指定するとC++例外処理ができる

* gnustl_static   -> Use GNU libstdc++ as a static library.
JNIのお作法1
   • JNIのインタフェース実装(Java側)
       – native 修飾子を使ってインタフェース名を定義
       – javahコマンドかeclipseからJNIのヘッダファイルが作成
         できる
   • JNI接続部分(ネイティブ側)
       – ファンクションテーブルを使ってJNIメソッドを管理
       – シグネチャはjavapコマンドでわかるよ
       – JNIメソッドをシステムに登録する
static JNINativeMethod gMethods[] = {       JNIEnv* env;
{“init”, “(II)V”, (void*)nativeGameInit}.   env -> FindClass
{“step”, “()V”, (void*)nativeStep}          env ->RegisterNatives(jclass, ファンクション
};                                          テーブル,登録するメソッドの個数)
JNIのお作法2
• JNI接続部分(ネイティブ側)続き
 – ネイティブ→Javaのコールバックのやり方

  env->GetObjectClass   // クラスの取得
  env->GetMethodId       // JavaメソッドのメソッドIDを取得
  env->CallVoidMethod     // 呼び出し
NDK ビルド/デプロイ/デバッグ
• ビルド・デプロイ
>[bash]ndk-build [NDK_DEBUG=1]
 //Cのライブラリのビルド(.so)
>ant debug(or ant release) //Javaのビルド(class,apk)
>ant install

• デバッグ gdb
>[bash]ndk-gdb
端末とHostマシン間はgdb-rsp(RSP(リモートシリアルプロトコル )
HostマシンのgdbとEclipse/VSはgdb-MI((Machine Interface) )



Gingerbreadでgdbデバッグのいろんなところが改善されて
快適になったからみんなドシドシつかってね!!
メインスレッド以外のスレッドでもブレイクポイントが張れたりデバッグ機能
が強化したよ
NativeActivityのバージョン互換
• 世の中にはまだまだFroyoとかEclairの端末がいっ
  ぱい
• Gingerbreadなんてまだまだ少ないよ
• ゲームエンジンを自分のアプリに移植したとき
  Gingerbread以上でも、それ以外のバージョンでも
  動くようにする
–    res/values-v9/bools.xml //動作するプラットフォームがGingerbreadの場合

                           <resources>
                           <bool name=“atLeastGingerbread”>true</bool>
                           <bool name=“notGingerbread”>false</bool>
                           </resources>

–    res/values/bools.xml //動作するプラットフォームがGingerbreadでない場合
                           <resources>
                           <bool name=“atLeastGingerbread”>false</bool>
                           <bool name=“notGingerbread”>true</bool>
                           </resources>

–    AndroidManifest.xml
    <activity android:name=“.SANativeActivity”
               android:enabled=“@bool/atLeastGingerbread”> <!--動作するプラットフォームがGingerbreadの場合-->
              <meta-data android:name=“android.app.lib_name”
            android:value=“sanative”>
           <intent-filter>
                 <action android:name=“android.intent.action.MAIN”/>
                 <action android:category=“android.intent.category.LAUNCHER”/>
           </intent-filter>
       </activity>
       <activity android:name=“.DemoActivity”      <!--動作するプラットフォームがGingerbreadでない場合-->
              android:enabled=“@bool/notGingerbread”>
           <intent-filter>
              <action android:name=“android.intent.action.MAIN”/>
              <action android:category=“android.intent.category.LAUNCHER”/>
           </intent-filter>
      </activity>
プロジェクトのファイル構成(jniディレクトリ以下)

/jni/libsajni/     ←Gingerbread以外の時にロードするスタブライブラリ
        ∟Android.mk
        ∟app-android.c
/jni/libsanangels/ ←ゲームのエンジンの本体を格納(シェアする)
/jni/libsanative/   ←NativeActivityのメタデータのライブラリに指定
       ∟ Android.mk
    ∟ app-android-native.c
    ∟ glutils.c
    ∟ glutils.h
:


/src/com/example/sanangeles/DemoActivity.java ←通常のActivityをextends
                             System.loadLibrary(“sanangeles”)
                             System.loadLibrary(“sajni”)


/src/com/example/sanangeles/SANativeActivity.java ←NativeActivityをextends

                        System.loadLibrary(“sanangeles”)
ゲームアプリを作るうえで大切なこと
•   Lifecycle
     – backキーが押されたときやfinish()でクローズされるまでアプリのプロセスは
       維持せよ
         • 特にフォアグランドのアクティビティのプロセスは超重要
         • killする(される)のは最後の手段
     – visibleなアクティビティは高優先度で。
         • バックグランドのアクティビティはさほど重要でない。アクティブでないアクティビ
           ティを持つプロセスが最初にkillされるように
     – アプリのイニシャライズ処理などをstatic関数にしたときは気をつけて
         • プロセスがアクティブである間ライブラリはunloadされずにいつまでも残る。
         • アクティビティのonCreate処理が終了後ならstatic な初期化を実行してもよい。
     – スレッド注意!
         • スレッドはアクティビティでなくプロセスに紐付けられている。アクティビティが生き
           続けてる限りスレッドはrunし続ける。
         • すべてのネイティブコードはonDestroyでcleanするべし
ゲームアプリを作るうえで大切なこと
• Input
   – キー入力のハンドリング
      • onKeyDown/onKeyUp
      • dispatchKeyEventのオーバーライドは避けて
      • onKeyMultiple/onKeyLongPressも使えるよ
   – タッチとマルチタッチのハンドリング
      • onTouchEvent
          – 内蔵のジェスチャープロセスが使えるよ
          – ScaleGestureDetectorとかGestureDetectorとか使ってみて。
      • ほとんどの端末が今マルチタッチをサポートしてる
          – 端末が異なるポイントを追跡できるかがわかるのはこれ。
          – hasSystemFeature(FEATURE_TOUCHSCREEN_MULTITOUCH_DIST
            INCT)
      • Androidらしいゲームとはハードボタンをうまく使うこと
          – Back・・・ダイアログのdissmiss、メニュー終了、ゲームのポーズ
          – Menu・・・ポーズ、オプションダイアログ起動
          – Home・・・ポーズ(ゲームを終わらせてはいけない!!!)
          – ボリュームボタン・・・
            setVolumeControlStream(AudioManager.STREAM_MUSIC)
          – onPauseやonStopを駆使して可能な限りゲームの状態を保存しよう
ゲームアプリを作るうえで大切なこと
• Graphics(OpenGL)
  – GLSurfaceView
    •   Context(Dalvikとネイティブコードの間でシェアされる)
    •   レンダリングをするスレッドを作る
    •   onPauseの間、コンテキストをリリースしてくれる
    •   OpenGLでのマルチタスクはもっとも効率的ではないが、いくつか
        のドライバが問題を回避する
  – Contextがlostしたら
    • リソースをリロードする
      (Textures,Buffer object, Shaders(シェーダ))
    • 名前は保持されない
ゲームアプリを作るうえで大切なこと
• Texture Formats
  – チップセットベンダはいくつかのさまざまなテクスチャの独
    自の圧縮フォーマットを使っている
  – Open GL ESはマルチ圧縮フォーマットをサポートしてい
    る(必須ではない)
  – 非圧縮テクスチャ
  – ETC1使用(フォトグラフィックデータを最適化、Alpha値は
    ない)
  – Multi-APK(coming soon)
  – asset サーバにテクスチャをおく
     • runtimeでの検出サポート
     • それぞれの端末でダウンロード
ゲームアプリを作るうえで大切なこと
•   描画性能
     – 描画のオーダーは大切
         • 早めの切り離し
     – VBOを使う(不必要な状態変化を回避)
     – テクスチャ
         • 2倍のサイズのテクスチャの電力を使う
                – とっても遅い
                – いくつかのチップセットで動かない
•   互換性のあるシェーダを書く
•   Queryの確認(属性の数、構文など)
     – 端末間でさまざま
     – 気をつけないとクラッシュするよ
     – supported は”performs well”とは意味が違う
•   Conditions
     – できるだけ使用を避ける。どしても使いたかったらシェーダの最後におく
     – 同じ結果を生成するためにmix(),clamp()などを使う
•   discard()
     – 回避して。使うなら最後に。
ゲームアプリを作るうえで大切なこと
• Sound
  – フル演奏ならMediaPlayer
     • コーデックはマルチプルフォーマットサポート
     • ファイルシステムやネットワークから再生可能
     • すばやいサウンドエフェクトのために、待ち時間、メモリ、CPU使用率な
       ど大きくなる
  – サウンド効果やクリップならSoundPool
     • コーデックはマルチプルフォーマットサポート
     • あらかじめ音源ファイルをプールにロードするので待ち時間は少ない
  – アプリで音を作るならAudioTrack(PCM音源)
  – OpenSL/ES
     • MediaPlayerとAudioTrackの便利な機能をあわせもつ
     • NDKでのみ使用できる
     • Android2.3以上
ゲームアプリを作るうえで大切なこと
• assets(資産)
  – JNI
     • APKファイル名の取得
          – context.getApplicationInfo.sourceDir
     • AssetFileDescriptorのインスタンスを取得
          – afd = context.getAssets.openFd(“Hoge.png”);
     • AssetFileDescriptorからオフセットや長さがわかる
          – long offset = afd.getStartOffset()]
          – long length = afd.getDeclaredLength()
          – afd.close()
  – オフセットを指定してAPKファイルを開き長さを指定してよ
    む(オーバヘッドの測定?)
  – Zip Utility
  – nativeでAssetManagerを使え(Gingerbread以降)
トラブルシューティング1

      問題

アプリが不思議とクラッシュする
トラブルシューティング1

        解決方法
   スレッドを確認してみて!!

JNIの複数のcontextがひとつのスレッドになってない?
    ひとつのJNIのcontextにつきスレッドは一本
トラブルシューティング2


      問題
  パフォーマンスが悪い
トラブルシューティング2
               解決方法
        ハードが古いんじゃないの?確認して!
               ARM5 CPUはOpenGL2サポートしてない

ハードが古くてもクラッシュさせずに動作させたい場合
    16bitのテクスチャを使え
       BitmapFactory.Options.inPreferredConfig = Bitmap.Config.ARGB_4444
    小さい描画ターゲットを使って拡大する
       SurficeHolder.setFixedSize()
              特にタブレットは高ピクセル。

何をどうやってもクラッシュしてしまう場合は
  マーケットでフィルタをかける
    命令セット(ARMv5/ARMv7)
    GL Version
    Platform を古いのに戻す
    有効なデバイスを使う
Tips
•   小さくスタート
•   Androidのbackup/restoreを使ってクラウドに保存
     – 端末を他に切り替えたときゲームの進捗を保持できる
•   人によって使うコントローラは違うのでどのコントロールデバイスにも対応させる
     – トラックボール、D-pad、ジョイスティック
•   SDカードへのインストールをサポート
     – これをしないとマーケットのユーザ評価が落ちます
•   プロファイリング
     – 端末ごとに最適な設定を選ぶためにプロファイリングをしよう
•   ソーシャル
     – OpenIDを使用したソーシャルネットワークを使ってみたら?
•   Live Wallpaperにしてみようよ?
     – ゲームのアバターと状態をホームスクリーンでもみれるといいよ
•   アプリ追跡
     – ゲームのマーケティングにいいよ
•   アプリ内課金
     – 新しい収益の手法を身に付けよう
はまったときのデバッグ支援ツール
•   開発ツール
    – NVIDIA Debug Manager(Eclipse用)
        • シンプルな設定で済むEclipse上でのネイティブデバッカ
    – WinGDB
        • NDKアプリのデバッグにVisual Studio を使う
            – www.wingdb.com
    – vs-android
        • Android ツールチェイン用のネイティブのMSBuild ファイル
            – vs-android.googlecode.com
•   性能評価ツール
    – NVIDIA PerfHUD ES
        • developer.nvidia.com/tegra/perfhud-es
    – Adreno Profiler
        • developer.qualcomm.com/showcase/adreno-profier
    – POWERVR Insider Utilities
        • PVRTraceやPVRTuneを含む
            – www.imgtec.com/powervr/insider/powervr-utiliyies.asp
もらっちゃいました!
0621 ndk game
0621 ndk game
開発用サンプルとか
• sonyericsson.com/developer
http://developer.sonyericsson.com/wportal/devworld/techno
   logy/android/xperiaplay/overview?cc=gb&lc=en

Weitere ähnliche Inhalte

Was ist angesagt?

-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろうnico0927
 
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_jaAiwolf seminar 2019_ja
Aiwolf seminar 2019_jaTakedaatsushi
 
㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2Nishida Kansuke
 
Ja sst'14東北 いまさら聞けないJenkins
Ja sst'14東北 いまさら聞けないJenkinsJa sst'14東北 いまさら聞けないJenkins
Ja sst'14東北 いまさら聞けないJenkins勝信 今井
 
Editor スクリプティング 入門
Editor スクリプティング 入門Editor スクリプティング 入門
Editor スクリプティング 入門Keigo Ando
 
猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4pafuhana 1213
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移まべ☆てっく運営
 
㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!Nishida Kansuke
 
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方Daisaku Mochizuki
 
App widgetでテザリング
App widgetでテザリングApp widgetでテザリング
App widgetでテザリングEiichi Tsuru
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624Kosuke Shinoda
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor ExtendedMasamitsu Ishikawa
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入Hiroki Tamiya
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明furusin
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張Shota Baba
 

Was ist angesagt? (20)

-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう
 
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_jaAiwolf seminar 2019_ja
Aiwolf seminar 2019_ja
 
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
 
UE4 Performance and Profiling | Unreal Dev Day Montreal 2017 (日本語訳)
UE4 Performance and Profiling | Unreal Dev Day Montreal 2017 (日本語訳)UE4 Performance and Profiling | Unreal Dev Day Montreal 2017 (日本語訳)
UE4 Performance and Profiling | Unreal Dev Day Montreal 2017 (日本語訳)
 
㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2
 
Ja sst'14東北 いまさら聞けないJenkins
Ja sst'14東北 いまさら聞けないJenkinsJa sst'14東北 いまさら聞けないJenkins
Ja sst'14東北 いまさら聞けないJenkins
 
Editor スクリプティング 入門
Editor スクリプティング 入門Editor スクリプティング 入門
Editor スクリプティング 入門
 
猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
 
㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!
 
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
 
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方
 
App widgetでテザリング
App widgetでテザリングApp widgetでテザリング
App widgetでテザリング
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor Extended
 
Aiwolfseminar2020
Aiwolfseminar2020Aiwolfseminar2020
Aiwolfseminar2020
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入
 
UE4モバイルブートキャンプ
UE4モバイルブートキャンプUE4モバイルブートキャンプ
UE4モバイルブートキャンプ
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張
 

Andere mochten auch

OpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメOpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメMasaki Otsuki
 
Androidのフレームワークをデバッグするために検出ツールを作ってた話
Androidのフレームワークをデバッグするために検出ツールを作ってた話Androidのフレームワークをデバッグするために検出ツールを作ってた話
Androidのフレームワークをデバッグするために検出ツールを作ってた話nhnmomonga
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介khisano
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた徹 上野山
 

Andere mochten auch (6)

Android Hacks - Hack47
Android Hacks - Hack47Android Hacks - Hack47
Android Hacks - Hack47
 
OpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメOpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメ
 
Androidのフレームワークをデバッグするために検出ツールを作ってた話
Androidのフレームワークをデバッグするために検出ツールを作ってた話Androidのフレームワークをデバッグするために検出ツールを作ってた話
Androidのフレームワークをデバッグするために検出ツールを作ってた話
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介
 
Android Hacks - Hack57
Android Hacks - Hack57Android Hacks - Hack57
Android Hacks - Hack57
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
 

Ähnlich wie 0621 ndk game

今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeomantomo_masakura
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことKatsutoshi Makino
 
Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Yuki Higuchi
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころKazuhiro Hara
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!Tanaka Yuichi
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことleverages_event
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Takashi EGAWA
 
GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!leverages_event
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Developers Summit
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Lumin Hacker
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!leverages_event
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナーTakahiro Iwase
 

Ähnlich wie 0621 ndk game (20)

今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
 
つぶLT20121215
つぶLT20121215つぶLT20121215
つぶLT20121215
 
Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころ
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
Google Product
Google ProductGoogle Product
Google Product
 
Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
 
GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 

Kürzlich hochgeladen

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 

Kürzlich hochgeladen (12)

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 

0621 ndk game

  • 1. Gingerbread以降のNDK ゲーム開発のTipsなど Google IO 報告会 発表資料 @cat_kaotaro
  • 2. 自己紹介 • @cat_kaotaro こと はしづめかおり と申します • 2009年の秋くらいからAndroidのおっかけしています • 「Okusama」というアプリつくってます • 会社ではAndroid技術者養成のための研修講師やお助け マンやってます • ACE(Androidアプリケーション技術者認定試験)の対策本 の執筆 – ベーシック対策実践問題集 (日経BP)2010年11月発売 – 徹底攻略ACE問題集(インプレスジャパン)2011年6月発売予定
  • 3. Bringing C and C++ Games to Android Dan Galpin 氏 Ian Ni-Lewis 氏
  • 4. 冒頭でJavaの駄目だし • ほとんどの人がJava以外の言語がすきなんじゃないか • Javaはすべてにおいて万能ではない • ゲームはハイパフォーマンスが求められる • C/C++の開発はNDKでやろう – 既存のネイティブライブラリの再利用 – サブルーチンの高速化 – VFP (Vector Floating Point 浮動小数点演算機能)、NEONアクセス – かといって絶対速くなるわけではないんだからね • NDK? – ツールチェイン(標準的なgccのクロスコンパイラ) – Android 用のプラットフォームビルドシステム – ヘッダとライブラリ(C,C++のランタイムなど) • Stable ABI(Application Binary interface) - armeabi – 移植したいライブラリがAndroidプラットフォームが持つシステムライブラ リでは使用できないかも
  • 5. 最近のNDKのトピック • FroyoではJNI Graphicsがサポート (libjnigraphics) • Gingerbreadではゲーム開発用に以下のライ ブラリが追加された – EGL(libEGL) – OpenSL ES(libOpenSLES) – Native framework/Native Activity(libandroid)
  • 6. NDKのセットアップ・開発手順 • 現在-r5b • Android DevelopersとかNDK内のドキュメン トに詳しく書いてある • Application.mkに APP_STL:=gnustl_static を指定するとC++例外処理ができる * gnustl_static -> Use GNU libstdc++ as a static library.
  • 7. JNIのお作法1 • JNIのインタフェース実装(Java側) – native 修飾子を使ってインタフェース名を定義 – javahコマンドかeclipseからJNIのヘッダファイルが作成 できる • JNI接続部分(ネイティブ側) – ファンクションテーブルを使ってJNIメソッドを管理 – シグネチャはjavapコマンドでわかるよ – JNIメソッドをシステムに登録する static JNINativeMethod gMethods[] = { JNIEnv* env; {“init”, “(II)V”, (void*)nativeGameInit}. env -> FindClass {“step”, “()V”, (void*)nativeStep} env ->RegisterNatives(jclass, ファンクション }; テーブル,登録するメソッドの個数)
  • 8. JNIのお作法2 • JNI接続部分(ネイティブ側)続き – ネイティブ→Javaのコールバックのやり方 env->GetObjectClass // クラスの取得 env->GetMethodId // JavaメソッドのメソッドIDを取得 env->CallVoidMethod // 呼び出し
  • 9. NDK ビルド/デプロイ/デバッグ • ビルド・デプロイ >[bash]ndk-build [NDK_DEBUG=1] //Cのライブラリのビルド(.so) >ant debug(or ant release) //Javaのビルド(class,apk) >ant install • デバッグ gdb >[bash]ndk-gdb 端末とHostマシン間はgdb-rsp(RSP(リモートシリアルプロトコル ) HostマシンのgdbとEclipse/VSはgdb-MI((Machine Interface) ) Gingerbreadでgdbデバッグのいろんなところが改善されて 快適になったからみんなドシドシつかってね!! メインスレッド以外のスレッドでもブレイクポイントが張れたりデバッグ機能 が強化したよ
  • 10. NativeActivityのバージョン互換 • 世の中にはまだまだFroyoとかEclairの端末がいっ ぱい • Gingerbreadなんてまだまだ少ないよ • ゲームエンジンを自分のアプリに移植したとき Gingerbread以上でも、それ以外のバージョンでも 動くようにする
  • 11. res/values-v9/bools.xml //動作するプラットフォームがGingerbreadの場合 <resources> <bool name=“atLeastGingerbread”>true</bool> <bool name=“notGingerbread”>false</bool> </resources> – res/values/bools.xml //動作するプラットフォームがGingerbreadでない場合 <resources> <bool name=“atLeastGingerbread”>false</bool> <bool name=“notGingerbread”>true</bool> </resources> – AndroidManifest.xml <activity android:name=“.SANativeActivity” android:enabled=“@bool/atLeastGingerbread”> <!--動作するプラットフォームがGingerbreadの場合--> <meta-data android:name=“android.app.lib_name” android:value=“sanative”> <intent-filter> <action android:name=“android.intent.action.MAIN”/> <action android:category=“android.intent.category.LAUNCHER”/> </intent-filter> </activity> <activity android:name=“.DemoActivity” <!--動作するプラットフォームがGingerbreadでない場合--> android:enabled=“@bool/notGingerbread”> <intent-filter> <action android:name=“android.intent.action.MAIN”/> <action android:category=“android.intent.category.LAUNCHER”/> </intent-filter> </activity>
  • 12. プロジェクトのファイル構成(jniディレクトリ以下) /jni/libsajni/ ←Gingerbread以外の時にロードするスタブライブラリ ∟Android.mk ∟app-android.c /jni/libsanangels/ ←ゲームのエンジンの本体を格納(シェアする) /jni/libsanative/ ←NativeActivityのメタデータのライブラリに指定 ∟ Android.mk ∟ app-android-native.c ∟ glutils.c ∟ glutils.h : /src/com/example/sanangeles/DemoActivity.java ←通常のActivityをextends System.loadLibrary(“sanangeles”) System.loadLibrary(“sajni”) /src/com/example/sanangeles/SANativeActivity.java ←NativeActivityをextends System.loadLibrary(“sanangeles”)
  • 13. ゲームアプリを作るうえで大切なこと • Lifecycle – backキーが押されたときやfinish()でクローズされるまでアプリのプロセスは 維持せよ • 特にフォアグランドのアクティビティのプロセスは超重要 • killする(される)のは最後の手段 – visibleなアクティビティは高優先度で。 • バックグランドのアクティビティはさほど重要でない。アクティブでないアクティビ ティを持つプロセスが最初にkillされるように – アプリのイニシャライズ処理などをstatic関数にしたときは気をつけて • プロセスがアクティブである間ライブラリはunloadされずにいつまでも残る。 • アクティビティのonCreate処理が終了後ならstatic な初期化を実行してもよい。 – スレッド注意! • スレッドはアクティビティでなくプロセスに紐付けられている。アクティビティが生き 続けてる限りスレッドはrunし続ける。 • すべてのネイティブコードはonDestroyでcleanするべし
  • 14. ゲームアプリを作るうえで大切なこと • Input – キー入力のハンドリング • onKeyDown/onKeyUp • dispatchKeyEventのオーバーライドは避けて • onKeyMultiple/onKeyLongPressも使えるよ – タッチとマルチタッチのハンドリング • onTouchEvent – 内蔵のジェスチャープロセスが使えるよ – ScaleGestureDetectorとかGestureDetectorとか使ってみて。 • ほとんどの端末が今マルチタッチをサポートしてる – 端末が異なるポイントを追跡できるかがわかるのはこれ。 – hasSystemFeature(FEATURE_TOUCHSCREEN_MULTITOUCH_DIST INCT) • Androidらしいゲームとはハードボタンをうまく使うこと – Back・・・ダイアログのdissmiss、メニュー終了、ゲームのポーズ – Menu・・・ポーズ、オプションダイアログ起動 – Home・・・ポーズ(ゲームを終わらせてはいけない!!!) – ボリュームボタン・・・ setVolumeControlStream(AudioManager.STREAM_MUSIC) – onPauseやonStopを駆使して可能な限りゲームの状態を保存しよう
  • 15. ゲームアプリを作るうえで大切なこと • Graphics(OpenGL) – GLSurfaceView • Context(Dalvikとネイティブコードの間でシェアされる) • レンダリングをするスレッドを作る • onPauseの間、コンテキストをリリースしてくれる • OpenGLでのマルチタスクはもっとも効率的ではないが、いくつか のドライバが問題を回避する – Contextがlostしたら • リソースをリロードする (Textures,Buffer object, Shaders(シェーダ)) • 名前は保持されない
  • 16. ゲームアプリを作るうえで大切なこと • Texture Formats – チップセットベンダはいくつかのさまざまなテクスチャの独 自の圧縮フォーマットを使っている – Open GL ESはマルチ圧縮フォーマットをサポートしてい る(必須ではない) – 非圧縮テクスチャ – ETC1使用(フォトグラフィックデータを最適化、Alpha値は ない) – Multi-APK(coming soon) – asset サーバにテクスチャをおく • runtimeでの検出サポート • それぞれの端末でダウンロード
  • 17. ゲームアプリを作るうえで大切なこと • 描画性能 – 描画のオーダーは大切 • 早めの切り離し – VBOを使う(不必要な状態変化を回避) – テクスチャ • 2倍のサイズのテクスチャの電力を使う – とっても遅い – いくつかのチップセットで動かない • 互換性のあるシェーダを書く • Queryの確認(属性の数、構文など) – 端末間でさまざま – 気をつけないとクラッシュするよ – supported は”performs well”とは意味が違う • Conditions – できるだけ使用を避ける。どしても使いたかったらシェーダの最後におく – 同じ結果を生成するためにmix(),clamp()などを使う • discard() – 回避して。使うなら最後に。
  • 18. ゲームアプリを作るうえで大切なこと • Sound – フル演奏ならMediaPlayer • コーデックはマルチプルフォーマットサポート • ファイルシステムやネットワークから再生可能 • すばやいサウンドエフェクトのために、待ち時間、メモリ、CPU使用率な ど大きくなる – サウンド効果やクリップならSoundPool • コーデックはマルチプルフォーマットサポート • あらかじめ音源ファイルをプールにロードするので待ち時間は少ない – アプリで音を作るならAudioTrack(PCM音源) – OpenSL/ES • MediaPlayerとAudioTrackの便利な機能をあわせもつ • NDKでのみ使用できる • Android2.3以上
  • 19. ゲームアプリを作るうえで大切なこと • assets(資産) – JNI • APKファイル名の取得 – context.getApplicationInfo.sourceDir • AssetFileDescriptorのインスタンスを取得 – afd = context.getAssets.openFd(“Hoge.png”); • AssetFileDescriptorからオフセットや長さがわかる – long offset = afd.getStartOffset()] – long length = afd.getDeclaredLength() – afd.close() – オフセットを指定してAPKファイルを開き長さを指定してよ む(オーバヘッドの測定?) – Zip Utility – nativeでAssetManagerを使え(Gingerbread以降)
  • 20. トラブルシューティング1 問題 アプリが不思議とクラッシュする
  • 21. トラブルシューティング1 解決方法 スレッドを確認してみて!! JNIの複数のcontextがひとつのスレッドになってない? ひとつのJNIのcontextにつきスレッドは一本
  • 22. トラブルシューティング2 問題 パフォーマンスが悪い
  • 23. トラブルシューティング2 解決方法 ハードが古いんじゃないの?確認して! ARM5 CPUはOpenGL2サポートしてない ハードが古くてもクラッシュさせずに動作させたい場合 16bitのテクスチャを使え BitmapFactory.Options.inPreferredConfig = Bitmap.Config.ARGB_4444 小さい描画ターゲットを使って拡大する SurficeHolder.setFixedSize() 特にタブレットは高ピクセル。 何をどうやってもクラッシュしてしまう場合は マーケットでフィルタをかける 命令セット(ARMv5/ARMv7) GL Version Platform を古いのに戻す 有効なデバイスを使う
  • 24. Tips • 小さくスタート • Androidのbackup/restoreを使ってクラウドに保存 – 端末を他に切り替えたときゲームの進捗を保持できる • 人によって使うコントローラは違うのでどのコントロールデバイスにも対応させる – トラックボール、D-pad、ジョイスティック • SDカードへのインストールをサポート – これをしないとマーケットのユーザ評価が落ちます • プロファイリング – 端末ごとに最適な設定を選ぶためにプロファイリングをしよう • ソーシャル – OpenIDを使用したソーシャルネットワークを使ってみたら? • Live Wallpaperにしてみようよ? – ゲームのアバターと状態をホームスクリーンでもみれるといいよ • アプリ追跡 – ゲームのマーケティングにいいよ • アプリ内課金 – 新しい収益の手法を身に付けよう
  • 25. はまったときのデバッグ支援ツール • 開発ツール – NVIDIA Debug Manager(Eclipse用) • シンプルな設定で済むEclipse上でのネイティブデバッカ – WinGDB • NDKアプリのデバッグにVisual Studio を使う – www.wingdb.com – vs-android • Android ツールチェイン用のネイティブのMSBuild ファイル – vs-android.googlecode.com • 性能評価ツール – NVIDIA PerfHUD ES • developer.nvidia.com/tegra/perfhud-es – Adreno Profiler • developer.qualcomm.com/showcase/adreno-profier – POWERVR Insider Utilities • PVRTraceやPVRTuneを含む – www.imgtec.com/powervr/insider/powervr-utiliyies.asp