暂停和恢复安卓游戏->

问题描述 投票:0回答:1

我在暂停和恢复游戏时遇到了困难。我遇到了一个错误IllegalThreadStateException,但有趣的是,这段代码在API 24上运行良好,没有任何问题。在更高的API上测试时,我遇到了麻烦。我是不是遗漏了什么?有什么建议吗?我还是个初学者,所以谢谢大家!

public class GameLoop extends Thread {
private final SurfaceHolder surfaceHolder;
private Game game;

public static final float MAX_UPS = 60;
private static final double UPS_PERIOD = 1E+3 / MAX_UPS;
public static boolean isRunning = false;
private double avarageUPS;
private double avarageFPS;

public GameLoop(Game game, SurfaceHolder surfaceHolder) {
    this.game = game;
    this.surfaceHolder = surfaceHolder;
}

public void startLoop() {
    Log.d("GameLoop.java", "startLoop()");
    isRunning = true;
    start();
}

public void stopLoop() {
    Log.d("GameLoop.java", "stopLoop()");
    isRunning = false;
    // Wait for thread to join
    try {
        join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    Log.d("GameLoop.java", "run()");
    super.run();

    //Declare time and cycle count variables
    int updateCount = 0;
    int frameCount = 0;
    long startTime;
    long elapsedTime;
    long sleepTime;

    //Game loop
    Canvas canvas = null;
    startTime = System.currentTimeMillis();
    while(isRunning){
        //Poskusi posodobiti in render game
        try{
            canvas = surfaceHolder.lockCanvas();
            synchronized (surfaceHolder){
                game.update();
                updateCount++;
                game.draw(canvas);
            }
        }catch(IllegalArgumentException e){
            e.printStackTrace();
        }finally {
            if(canvas != null){
                try{
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    frameCount++;
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }

        //Pause game loop to not exceed target UPS
        elapsedTime = System.currentTimeMillis() - startTime;
        sleepTime = (long) (updateCount * UPS_PERIOD - elapsedTime);
        if(sleepTime > 0){
            try {
                sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //Skip frames to keep up with target UPS
        while(sleepTime < 0 && updateCount < MAX_UPS-1){
            game.update();
            updateCount++;
            elapsedTime = System.currentTimeMillis() - startTime;
            sleepTime = (long) (updateCount * UPS_PERIOD - elapsedTime);
        }

        //Calculate avarage UPS in FPS
        elapsedTime = System.currentTimeMillis() - startTime;
        if(elapsedTime >= 1000){
            avarageUPS = updateCount / (1E-3 * elapsedTime);
            avarageFPS = frameCount / (1E-3 * elapsedTime);
            updateCount = 0;
            frameCount = 0;
            startTime = System.currentTimeMillis();
        }
    }
}

public double getAvarageUPS() {
    return avarageUPS;
}

public double getAvarageFPS() {
    return avarageFPS;
}

}

java android multithreading
1个回答
0
投票

如果你想在同一个线程上再次调用start,你不能。 在一个线程结束后,你需要创建一个新的实例,同一个实例不能重新运行。

© www.soinside.com 2019 - 2024. All rights reserved.