Slides for the talk "Beginning Android Games" at Apps World 2012 by Mario Zechner
@badlogicgames
http://www.badlogicgames.com
http://libgdx.badlogicgames.com
26. What‘s in a Game?
• Window & Life-Cycle Management
• File I/O
• Input Devices
• Audio
• Graphics
• Networking
• Social Media Integration
• Payment System
• Tools
• … you actually read all of this?
31. Android for Game Developers
• Store files in
– APK (read-only)
– Internal Storage (read/write, limited space)
– External Storage (read/write)
• SharedPreferences for simple settings
• GOTCHAS
– APK size limit (50mb)
– Asset file compression bug until Android 2.3
– No direct access via NDK in older Android versions
32. Android for Game Developers
• OnTouchListener and OnKeyListener on
View
• SensorManager for
compass, accelerometer, gyro, …
• USB/NFC since Android 3+
• GOTCHAS
– Horrible Touch API
– Multi-touch broken on many devices
33. Android for Game Developers
• SoundPool for sound effects
• MediaPlayer for streaming music
• OpenSL ES in C/C++
setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC,
0);
• GOTCHAS
explosionId = soundPool.load(descriptor, 1);
soundPool.play(explosionId, 1, 1, 0, 0, 1);
– High latency (+100ms)
– Broken drivers mediaPlayer = new MediaPlayer()
mediaPlayer.setDataSource(descriptor.getFileDescriptor(),
descriptor.getStartOffset(), descriptor.getLength());
mediaPlayer.prepare();
mediaPlayer.setLooping(true);
mediaPlayer.start()
35. Android for Game Developers
Canvas OpenGL ES
canvas.drawRGB(255, 255, 255);
paint.setColor(Color.RED);
canvas.drawLine(0, 0, canvas.getWidth()-1, canvas.getHeight()-1, paint);
paint.setStyle(Style.STROKE);
paint.setColor(0xff00ff00);
canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 40, paint);
paint.setStyle(Style.FILL);
paint.setColor(0x770000ff);
canvas.drawRect(100, 100, 200, 200, paint);
+ Ease-of-Use + Performance
- Performance + 2D / 3D
- 2D-only - Ease-of-Use
MY GOD, IT‘S FULL OF GOTCHAS
36. Android for Game Developers
Canvas OpenGL ES
canvas.drawRGB(255, 255, 255);
paint.setColor(Color.RED);
canvas.drawLine(0, 0, canvas.getWidth()-1, canvas.getHeight()-1, paint);
paint.setStyle(Style.STROKE);
paint.setColor(0xff00ff00);
canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 40, paint);
paint.setStyle(Style.FILL);
paint.setColor(0x770000ff);
canvas.drawRect(100, 100, 200, 200, paint);
+ Ease-of-Use + Performance
- Performance + 2D / 3D
- 2D-only - Ease-of-Use
MY GOD, IT‘S FULL OF GOTCHAS
37. Android for Game Developers
• Bugs in shader compilers
• Deviations from OpenGL ES specification
• Highly varying performance
• GPU dependent optimizations
• Texture compression formats
• …
38. Android for Game Developers
• And if you use Java …
• Garbage Collector pauses (+200ms)
• Varying maximum heap memory
• Direct ByteBuffers and Bitmaps counted
against Java heap
• Method call overhead
39. Android for Game Developers
• A lot better since 2.2, great since 4.0
• Concurrent GC
• JIT
• Tons of bug fixes
• GOTCHA
42. Android for Game Developers
Screen Sizes, Aspect Ratios, Resolutions
43. Android for Game Developers
• Pick target resolution/aspect ratio
• Stretch or Clip on other aspect ratios
• Ship multiple asset sizes
• We‘ve done this on the PC, we can do it on
Android!
49. • Java (lots of C/C++ under the hood)
• Develop on the desktop 90% of the time (no
slow deploys, no emulator madness)
• Abstraction layers
– Low-level: OpenGL ES, file i/o, input, audio, ...
– Mid-level: shaders, textures, linalg, …
– High-level: fonts, sprites, scene graph, …
• Pick and choose, see feature list
http://libgdx.badlogicgames.com/features.html