More Related Content Similar to Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット) (20) More from Google Developer Relations Team (14) Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)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
8. Developer DayGoogle 2010
端末の特徴
• 画面サイズ、解像度
• インプット機能
– トラックボール、十字キー、キーボード、マルチタッチ
– API的に対応しやすい
• MotionEvent か KeyEvent
• OpenGL
- テクスチャフォーマット: ATITC? PVRTC? ETC1?
- OpenGL バーション
- GL_EXTENSIONS?
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. • 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
パフォーマンステスト
16. Developer DayGoogle 2010
パフォーマンスを高める方法
• 必ずVBOを利用
• VBOの数を減らす
• 浮動小数点数の頂点を利用
• テクスチャコンプレッションならETC1
• 2DならOpenGLのdraw_textureエクステンション
• 30ヘルツで遊べるように プランニング
• 第一世代端末から第二世代端末までランタイムでスケール
– GL_EXTENSIONSは役に立つ
• 第二世代のみの端末用ゲームなら、GLES2.0を利用
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. 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
}
}
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. 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. 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;
}
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
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
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. Developer DayGoogle 2010
“It’s not really about innovation so much
as exploring interestingness.”
Jonathan Blow, author of Braid
楽しいゲームには「革新」より
「面白さ」のほうが大事
43. Developer DayGoogle 2010
Useful Links
• http://developer.android.com
– 初めに
• http://code.google.com/p/apps-for-android/
– SpriteMethodTest, HeightMapProfiler
•http://replicaisland.net
– ソースコード、ブログ、など