Developer DayGoogle 2010
Developer DayGoogle 2010
Android でリアルタイムゲームを
開発する方法:リベンジ
Chris Pruett
Developer DayGoogle 2010
再帰代名詞
• Androidの「デベロッパーアドボケイト」です。
– ちょっと無理があるタイトルですが。。。
• グーグル入社前は、ゲーム会社で働く。
– GBA, PS2, PSP, Wii...
Developer DayGoogle 2010
Developer DayGoogle 2010
第一世代
第二世代
端末の種類
• 528mhz ARM11 CPU (約 400mhzに設定)
• Qualcomm MSM7200A など
• OpenGL ES 1.0 / 1.1 + ATI GPU
• 画面は3.2” HVGA (480x320)
• 30ヘルツ内に...
Developer DayGoogle 2010
第二世代端末
*Textured, unlit, colored verts
• 600 mhz - 1 ghz CPUs
• Snapdragon, OMAP3
• OpenGL ES 2.0...
Developer DayGoogle 2010
端末の特徴
• 画面サイズ、解像度
• インプット機能
– トラックボール、十字キー、キーボード、マルチタッチ
– API的に対応しやすい
• MotionEvent か KeyEvent
• ...
Developer DayGoogle 2010
現在のAndroidのバーションの割合
as of 9/1/2010
source: http://developer.android.com/resources/dashboard/platf...
• OpenGL ES 1.1
– Static VBO, floating point units
– Verts, texture, colors
– 512x512x16 texture, no mip maps, no compress...
Developer DayGoogle 2010
HeightMapProfiler
Developer DayGoogle 2010
HeightMapProfiler
Developer DayGoogle 2010
端末比較
32 ms
Results of testing with HeightMapProfiler
Developer DayGoogle 2010
頂点を増やしたテスト
32 ms
Results of testing with HeightMapProfiler
Developer DayGoogle 2010
LODの価値
4 FPS 16 FPS 35 FPS
Developer DayGoogle 2010
パフォーマンスを高める方法
• 必ずVBOを利用
• VBOの数を減らす
• 浮動小数点数の頂点を利用
• テクスチャコンプレッションならETC1
• 2DならOpenGLのdraw_textu...
Developer DayGoogle 2010
ワンダのレプリカ島の描画方法
Sprites: draw_texture
Background: draw_texture
Tile layers:VBOs
Developer DayGoogle 2010
バックグラウンドの表示
一つのVBOからタイルのスキャンライン
Developer DayGoogle 2010
二つのスレッドの仕組み
Activity
Surface
Holder
Rendering
Thread
OpenGL ES
Context
Game
Thread
Sound
Pool
And...
Developer DayGoogle 2010
Render Thread
SurfaceH
Rendering
Thread
OpenGL
Conte
me
ead
Input Events
GLSurfaceView
Developer DayGoogle 2010
Activity + GLSurfaceView
public class GameActivity extends Activity {
private GLSurfaceView mGLVi...
Developer DayGoogle 2010
GLSurfaceView.Renderer
class AwesomeGameRenderer implements GLSurfaceView.Renderer {
public void ...
Activity
Surface
Holder
Rendering
Thread
OpenGL ES
Context
Game
Thread
Sound
Pool
Android Framework
Input Events
Input Eve...
Developer DayGoogle 2010
JNIでレンダリング
class AwesomeGameRenderer implements GLSurfaceView.Renderer {
static {
System.loadLibr...
Developer DayGoogle 2010
JNIで接続
extern "C" {
JNIEXPORT void JNICALL Java_com_package_ AwesomeGameRenderer_nativeGameInit(J...
Developer DayGoogle 2010
JNIで接続第二パターン
static JNINativeMethod methods[] = {
{"nativeGameInit", "()V", (void*)nativeGameInit...
Developer DayGoogle 2010
100%NDKモデル
Activity
Surface
Holder
Rendering
Thread
OpenGL ES
Context
Sound
Pool
Android Framewor...
Developer DayGoogle 2010
EGL Context and Pausing
VRAM
Developer DayGoogle 2010
EGL Context and Pausing
VRAM
Developer DayGoogle 2010
Developer DayGoogle 2010
ワンダのレプリカ島の最初の4ヶ月
0
300,000
600,000
900,000
1,200,000
1,500,000
Mar9,2010
Mar18,2010
Mar27,2010
Ap...
Developer DayGoogle 2010
学んだこと:操作設定は必要
Developer DayGoogle 2010
Original Input System
Activity
Thread
Input
System
Game
MotionEvents
KeyEvents
Track Ball
Developer DayGoogle 2010
Original Input System
Activity
Thread
Input
System
Game
MotionEvents
KeyEvents
Track Ball
Touch S...
Developer DayGoogle 2010
Original Input System
Activity
Thread
Input
System
Game
MotionEvents
KeyEvents
Track Ball
Touch S...
Developer DayGoogle 2010
Current Input System
Activity
Thread
Input
System
Game
MotionEvents
KeyEvents
Input
Interface
Raw...
Developer DayGoogle 2010
これって楽しいだろうか
Developer DayGoogle 2010
ユーザーデータ
Developer DayGoogle 2010
100%NDKモデル
Activity
Surface
Holder
Rendering
Thread
OpenGL ES
Context
Sound
Pool
Android Framewor...
Developer DayGoogle 2010
Android でしか存在しない仕組み
Activity
Surface
Holder
Rendering
Thread
OpenGL ES
Context
Web
Server
Sound
P...
Developer DayGoogle 2010
“It’s not really about innovation so much
as exploring interestingness.”
Jonathan Blow, author of...
Developer DayGoogle 2010
Android上のゲームダウンロード
Androidマーケットの
ゲームカテゴリ
• ユーザランキン第2位
• ダウンロードが一番多い
• インプレッションは一番高い
2/19 3/20 4/1...
Developer DayGoogle 2010
Useful Links
• http://developer.android.com
– 初めに
• http://code.google.com/p/apps-for-android/
– ...
Upcoming SlideShare
Loading in …5
×

Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)

9,340 views

Published on

Android 用ゲームを作るのには、何が必要でしょうか。Android 専用ゲームというのは、どんなゲームでしょうか。Android の様々な端末に対応するのには、どうすればいいでしょうか。このセッションでは Android の成功するゲームの作り方を説明します。ダウンロード回数 120 万回を超える「ワンダのレプリカ島」という横スクロールアクションゲームを利用した、Android 的なゲーム開発方法についての発表になります。技術的な内容だけではなく、ゲームのプラニングや Android マーケットについて説明します。

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,340
On SlideShare
0
From Embeds
0
Number of Embeds
1,981
Actions
Shares
0
Downloads
37
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)

  1. 1. Developer DayGoogle 2010
  2. 2. Developer DayGoogle 2010 Android でリアルタイムゲームを 開発する方法:リベンジ Chris Pruett
  3. 3. Developer DayGoogle 2010 再帰代名詞 • Androidの「デベロッパーアドボケイト」です。 – ちょっと無理があるタイトルですが。。。 • グーグル入社前は、ゲーム会社で働く。 – GBA, PS2, PSP, Wii用に約10本のゲーム開発に エンジニアとして参加。
  4. 4. Developer DayGoogle 2010
  5. 5. Developer DayGoogle 2010 第一世代 第二世代 端末の種類
  6. 6. • 528mhz ARM11 CPU (約 400mhzに設定) • Qualcomm MSM7200A など • OpenGL ES 1.0 / 1.1 + ATI GPU • 画面は3.2” HVGA (480x320) • 30ヘルツ内に約5000頂点* • 60ヘルツ内に約1024頂点* Developer DayGoogle 2010 第一世代端末 *Textured, unlit, colored verts
  7. 7. Developer DayGoogle 2010 第二世代端末 *Textured, unlit, colored verts • 600 mhz - 1 ghz CPUs • Snapdragon, OMAP3 • OpenGL ES 2.0, 1.1 • 画面はWVGA (800x480) • 30ヘルツ内に約3万頂点* • 30ヘルツを超えられない端末も存在
  8. 8. Developer DayGoogle 2010 端末の特徴 • 画面サイズ、解像度 • インプット機能 – トラックボール、十字キー、キーボード、マルチタッチ – API的に対応しやすい • MotionEvent か KeyEvent • OpenGL - テクスチャフォーマット: ATITC? PVRTC? ETC1? - OpenGL バーション - GL_EXTENSIONS?
  9. 9. Developer DayGoogle 2010 現在のAndroidのバーションの割合 as of 9/1/2010 source: http://developer.android.com/resources/dashboard/platform-versions.html Android 1.5 Android 1.6 Android 2.1 Android 2.2 29% 42% 18% 12% Android 1.5 Android 1.6 Android 2.1 Android 2.2
  10. 10. • OpenGL ES 1.1 – Static VBO, floating point units – Verts, texture, colors – 512x512x16 texture, no mip maps, no compression – Variable scene complexity Developer DayGoogle 2010 パフォーマンステスト
  11. 11. Developer DayGoogle 2010 HeightMapProfiler
  12. 12. Developer DayGoogle 2010 HeightMapProfiler
  13. 13. Developer DayGoogle 2010 端末比較 32 ms Results of testing with HeightMapProfiler
  14. 14. Developer DayGoogle 2010 頂点を増やしたテスト 32 ms Results of testing with HeightMapProfiler
  15. 15. Developer DayGoogle 2010 LODの価値 4 FPS 16 FPS 35 FPS
  16. 16. Developer DayGoogle 2010 パフォーマンスを高める方法 • 必ずVBOを利用 • VBOの数を減らす • 浮動小数点数の頂点を利用 • テクスチャコンプレッションならETC1 • 2DならOpenGLのdraw_textureエクステンション • 30ヘルツで遊べるように プランニング • 第一世代端末から第二世代端末までランタイムでスケール – GL_EXTENSIONSは役に立つ • 第二世代のみの端末用ゲームなら、GLES2.0を利用
  17. 17. Developer DayGoogle 2010 ワンダのレプリカ島の描画方法 Sprites: draw_texture Background: draw_texture Tile layers:VBOs
  18. 18. Developer DayGoogle 2010 バックグラウンドの表示 一つのVBOからタイルのスキャンライン
  19. 19. Developer DayGoogle 2010 二つのスレッドの仕組み Activity Surface Holder Rendering Thread OpenGL ES Context Game Thread Sound Pool Android Framework Input Events Input Events
  20. 20. Developer DayGoogle 2010 Render Thread SurfaceH Rendering Thread OpenGL Conte me ead Input Events GLSurfaceView
  21. 21. Developer DayGoogle 2010 Activity + GLSurfaceView public class GameActivity extends Activity { private GLSurfaceView mGLView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AwesomeGameRenderer renderer = new AwesomeGameRenderer(); mGLView = new GLSurfaceView(this); mGLView.setRenderer(renderer); setContentView(mGLView); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); } @Override protected void onResume() { super.onResume(); mGLView.onResume(); } }
  22. 22. Developer DayGoogle 2010 GLSurfaceView.Renderer class AwesomeGameRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 gl, EGLConfig config) { // One-time GL setup goes here } public void onSurfaceChanged(GL10 gl, int w, int h) { // Viewport operations go here. } public void onDrawFrame(GL10 gl) { // Draw the frame } }
  23. 23. Activity Surface Holder Rendering Thread OpenGL ES Context Game Thread Sound Pool Android Framework Input Events Input Events Developer DayGoogle 2010 NDKとの繋がり Native Code Native Code
  24. 24. Developer DayGoogle 2010 JNIでレンダリング class AwesomeGameRenderer implements GLSurfaceView.Renderer { static { System.loadLibrary("nativegamelib"); } private static native void nativeGameInit(); private static native void nativeGameResize(int w, int h); private static native void nativeDrawFrame(); public void onSurfaceCreated(GL10 gl, EGLConfig config) { // One-time GL setup goes here nativeGameInit(); } public void onSurfaceChanged(GL10 gl, int w, int h) { // Viewport operations go here. nativeGameResize(w, h); } public void onDrawFrame(GL10 gl) { // Draw the frame nativeDrawFrame(); }
  25. 25. Developer DayGoogle 2010 JNIで接続 extern "C" { JNIEXPORT void JNICALL Java_com_package_ AwesomeGameRenderer_nativeGameInit(JNIEnv * env, jobject obj); JNIEXPORT void JNICALL Java_com_package_ AwesomeGameRenderer_nativeGameResize(JNIEnv * env, jobject obj, jint width, jint height); JNIEXPORT void JNICALL Java_com_package_ AwesomeGameRenderer_nativeDrawFrame(JNIEnv * env, jobject obj); }
  26. 26. Developer DayGoogle 2010 JNIで接続第二パターン static JNINativeMethod methods[] = { {"nativeGameInit", "()V", (void*)nativeGameInit }, {"nativeDrawFrame", "()V", (void*)nativeDrawFrame }, {"nativeGameResize", "(II)V", (void*)nativeRender }, }; /* * Register several native methods for one class. */ static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; char* className = "com/package/AwesomeGameRenderer"; clazz = env->FindClass(className); if (clazz == NULL) { char error[255]; sprintf(error, "Native registration unable to find class '%s'n", className); __android_log_print(ANDROID_LOG_ERROR, "AwesomeGame", error); return JNI_FALSE; } if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { char error[255]; sprintf(error, "RegisterNatives failed for '%s'n", className); __android_log_print(ANDROID_LOG_ERROR, "AwesomeGame", error); return JNI_FALSE; } return JNI_TRUE; }
  27. 27. Developer DayGoogle 2010 100%NDKモデル Activity Surface Holder Rendering Thread OpenGL ES Context Sound Pool Android Framework Input Events Input Events Native Code
  28. 28. Developer DayGoogle 2010 EGL Context and Pausing VRAM
  29. 29. Developer DayGoogle 2010 EGL Context and Pausing VRAM
  30. 30. Developer DayGoogle 2010
  31. 31. Developer DayGoogle 2010 ワンダのレプリカ島の最初の4ヶ月 0 300,000 600,000 900,000 1,200,000 1,500,000 Mar9,2010 Mar18,2010 Mar27,2010 Apr5,2010 Apr14,2010 Apr23,2010 May3,2010 May12,2010 May21,2010 May31,2010 Jun9,2010 Jun18,2010 Jun28,2010 Jul7,2010 Replica Island: First For Months
  32. 32. Developer DayGoogle 2010 学んだこと:操作設定は必要
  33. 33. Developer DayGoogle 2010 Original Input System Activity Thread Input System Game MotionEvents KeyEvents Track Ball
  34. 34. Developer DayGoogle 2010 Original Input System Activity Thread Input System Game MotionEvents KeyEvents Track Ball Touch Screen Orientation Sensor
  35. 35. Developer DayGoogle 2010 Original Input System Activity Thread Input System Game MotionEvents KeyEvents Track Ball Touch Screen Orientation Sensor Keyboard Tilt Controls D-Pad
  36. 36. Developer DayGoogle 2010 Current Input System Activity Thread Input System Game MotionEvents KeyEvents Input Interface Raw State JumpTiltMovement Attack
  37. 37. Developer DayGoogle 2010 これって楽しいだろうか
  38. 38. Developer DayGoogle 2010 ユーザーデータ
  39. 39. Developer DayGoogle 2010 100%NDKモデル Activity Surface Holder Rendering Thread OpenGL ES Context Sound Pool Android Framework Input Events Input Events Native Code
  40. 40. Developer DayGoogle 2010 Android でしか存在しない仕組み Activity Surface Holder Rendering Thread OpenGL ES Context Web Server Sound Pool Android Framework Input Events Input Events Native Code
  41. 41. Developer DayGoogle 2010 “It’s not really about innovation so much as exploring interestingness.” Jonathan Blow, author of Braid 楽しいゲームには「革新」より 「面白さ」のほうが大事
  42. 42. Developer DayGoogle 2010 Android上のゲームダウンロード Androidマーケットの ゲームカテゴリ • ユーザランキン第2位 • ダウンロードが一番多い • インプレッションは一番高い 2/19 3/20 4/18 5/18 6/17 7/16 8/14 9/12 Android Daily Game Downloads Source: Internal Google Data, September 2010
  43. 43. Developer DayGoogle 2010 Useful Links • http://developer.android.com – 初めに • http://code.google.com/p/apps-for-android/ – SpriteMethodTest, HeightMapProfiler •http://replicaisland.net – ソースコード、ブログ、など

×