Android: I have created a multi-threaded Looper game loop. Please give feedback!

Started by
1 comment, last by tom_mai78101 11 years, 8 months ago
Notice: I have updated the code snippet. Please take a look at post #3. Updated to make the code more pure multi-threaded.

Link for the lazy :D ---> Link.
Advertisement
I recommend you to try OpenGL ES, it will be way more easy to use GLSurfaceView in the end
The reason I use a simple SurfaceView is done for demonstration purposes only. I don't want to give out intermediate levels of Android stuffs all of a sudden.

Anyway, thanks for the feedback, and you'll probably like this one.

[color=#FF0000]Multi-Threaded Looper game loop, version 2.0.

Basic class (version 2.0)

package ff.ff;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;

public class Basic extends Activity implements Runnable {
Thread thread;
GameView view;
Looper loop;
public void onCreate(Bundle b){
super.onCreate(b);
view = new GameView(this);
setContentView(view);
}

//How to start off the Looper loop after initialization.
public void run(){
Looper.prepare();
loop = Looper.myLooper();
//You can set infinite amounts of Handler objects. Here, I set up 2 of them
//for demonstration.
view.setHandler(new Handler(), new Handler());
Looper.loop();
}

//How to quit a Looper loop.
public void onPause(){
super.onPause();
loop.quit();
boolean retry = true;
while (retry){
try{
thread.join();
retry = false;
}
catch (InterruptedException e){
retry = true;
}
}
view.onPause();
}

//How to begin the initialization of the Looper loop.
//Notice the Thread() begins here.
public void onResume(){
super.onResume();
thread = new Thread(this);
thread.setName("Activity Thread");
thread.start();
view.onResume();
}
}


GameView class (version 2.0)

package ff.ff;
import android.app.Activity;
import android.graphics.Canvas;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView implements Runnable {
SurfaceHolder holder;
Thread gameThread;
volatile boolean running;

// Any amount of handlers here. You can also create an array of Handler objects
// to your heart's content.
Handler handler1;
Handler handler2;
//Etc...

public int red;
public int blue;

Runnable r1 = new Runnable() {
public void run() {
/*
* This is the place where you update your objects' states in. This is
* placed in the tick() method, which is used below.
*/
red++;
if (red > 255)
red = 0;
Log.d("handler 1", Integer.toString(red));
}
};

//Same goes for this Runnable and other future Runnable implementations.
Runnable r2 = new Runnable(){
public void run(){
blue++;
if (blue > 255)
blue = 0;
Log.d("handler 2", Integer.toString(blue));
}
};

public GameView(Activity a) {
super(a);
holder = getHolder();
}

public void setHandler(Handler h1, Handler h2) {
handler1 = h1;
handler2 = h2;
}

//Here's how you quit a thread. Since Thread.stop() is deprecated, this is the more accepted version.
//NOTE: Oracle devs should implement this new method to replace the old stop().
public void onPause() {
running = false;
boolean retry = true;
while(retry) {
try {
gameThread.join();
retry = false;
}
catch(InterruptedException e) {
retry = true;
}
}
}

//This is how you resume a paused thread. Notice the "volatile" boolean at the top.
//It's used here.
public void onResume() {
running = true;
gameThread = new Thread(this);
gameThread.setName("Game Thread");
gameThread.start();
}

public void run() {
while(running) {
tick();
/*
* This is where you do the rendering / drawing. The game loop's basic structure is now
* complete. As for the tweaking that may be missing, it's up to the developers to
* create and fix them.
*
* I only give out the basic template of the Multi-Threaded Looper game loop.
*
* 8/16/2012 - This is updated. It's now Multi-Threaded Looper game loop v2.0.
*/
if (holder != null) {
if (holder.getSurface().isValid()) {
Canvas c = holder.lockCanvas();
c.drawARGB(255, red, 255, blue);
holder.unlockCanvasAndPost(c);
}
}
}
}

public void tick() {
//Increase the number of Handlers here. For an array of Handler elements, create a for... loop.
if (handler1 != null)
handler1.post(r1);
if (handler2 != null)
handler2.post(r2);
//Etc...
}
}


Again, please provide feedback. Thanks for viewing!

This topic is closed to new replies.

Advertisement