Jump to content
  • Advertisement
Sign in to follow this  

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

This topic is 2103 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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. Edited by tom_mai78101

Share this post


Link to post
Share on other sites
Advertisement
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!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!