102 lines
2.6 KiB
Java
Executable File
102 lines
2.6 KiB
Java
Executable File
package com.hyperling.apps.games;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.util.Log;
|
|
import android.view.SurfaceHolder;
|
|
|
|
/**
|
|
* Created by ling on 12/17/16.
|
|
*/
|
|
|
|
public class GameLoopThread extends Thread {
|
|
private final int FPS = 30;
|
|
protected double averageFPS;
|
|
private SurfaceHolder surfaceHolder;
|
|
private GameView gameView;
|
|
private boolean running;
|
|
public static Canvas canvas;
|
|
|
|
public boolean markerFrame;
|
|
|
|
private String TAG;
|
|
|
|
public GameLoopThread(SurfaceHolder sh, GameView gv){
|
|
super();
|
|
surfaceHolder = sh;
|
|
gameView = gv;
|
|
|
|
TAG = gameView.getResources().getString(R.string.TAG);
|
|
|
|
markerFrame = false;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
super.run();
|
|
|
|
long timeStart, timeRun, timeWait, timeTotal, timeTarget;
|
|
timeTotal = 0;
|
|
timeTarget = 1000/FPS;
|
|
|
|
int frameCount = 0;
|
|
|
|
while(running){
|
|
timeStart = System.currentTimeMillis();
|
|
canvas = null;
|
|
|
|
try{
|
|
canvas = this.surfaceHolder.lockCanvas();
|
|
synchronized (surfaceHolder){
|
|
this.gameView.update();
|
|
this.gameView.draw(canvas);
|
|
}
|
|
} catch(Exception e){
|
|
e.printStackTrace();
|
|
} finally {
|
|
if (canvas != null) {
|
|
try {
|
|
surfaceHolder.unlockCanvasAndPost(canvas);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
timeRun = (System.currentTimeMillis() - timeStart);
|
|
timeWait = timeTarget - timeRun;
|
|
|
|
if (timeWait > 0) {
|
|
try {
|
|
this.sleep(timeWait);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
timeTotal += System.currentTimeMillis()-timeStart;
|
|
frameCount++;
|
|
if (frameCount >= FPS){
|
|
averageFPS = 1000/((timeTotal/frameCount));
|
|
frameCount = 0;
|
|
timeTotal = 0;
|
|
|
|
Log.i(TAG, "GameLoopThread.run(): averageFPS=" + averageFPS);
|
|
Log.d(TAG, "GameLoopThread.run(): canvas.getHeight()=" + canvas.getHeight() + ", canvas.getWidth()=" + canvas.getWidth());
|
|
|
|
markerFrame = true;
|
|
}
|
|
else{
|
|
markerFrame = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setRunning(boolean r){
|
|
running = r;
|
|
|
|
if (running) {
|
|
this.start();
|
|
}
|
|
}
|
|
}
|