Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 tom_mai78101   Members   -  Reputation: 575

Like
0Likes
Like

Posted 09 August 2012 - 04:12 AM

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, 16 August 2012 - 08:05 AM.


Sponsor:

#2 rockseller   Members   -  Reputation: 121

Like
0Likes
Like

Posted 12 August 2012 - 12:16 PM

I recommend you to try OpenGL ES, it will be way more easy to use GLSurfaceView in the end

#3 tom_mai78101   Members   -  Reputation: 575

Like
0Likes
Like

Posted 16 August 2012 - 08:03 AM

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.

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!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS