java - 暂停和恢复 Android 游戏 ->

标签 java android multithreading

我在暂停和恢复游戏时遇到困难。我遇到了错误 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 游戏 ->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61416008/

相关文章:

java - 多个 Maven 模块来分离测试、API 和实现

python - 有没有办法拒绝预定的计时器事件?

java - != 检查线程安全吗?

c# - 如何检查线程是否完成执行

java - Eclipse 的行为就像选择了 <1.5 的编译器一样,尽管设置了 1.7

java - 如何分解字符串?

java - JPA EntityManager 在删除时不会引发约束违规

android - 需要在 Android 中伪造正在扫描的 NFC 标签

android - React-Native 无法构建 DependencyGraph : Watchman error

javascript - 平板设备上的 Web 应用程序只有灰色