You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏暂停后继续功能异常求助:Thread.sleep致窗口无响应

解决游戏暂停后窗口冻结的问题

嘿,我完全懂你遇到的麻烦——你用Thread.sleep()来实现暂停,结果游戏直接卡住不动,看起来像无响应对吧?这是因为你在游戏的主线程(也就是负责画面渲染、用户交互和游戏逻辑更新的线程)里调用了sleep,把它直接“睡死”了,自然整个窗口都没法正常工作。

为什么你的代码会出问题

你这段代码里的Thread.sleep(1000)是在主线程执行的:

if (Var.tropfeny > 760) {
    Var.tropfeny = -10;
    Var.tropfenx = Var.n1;
    Var.playerPoints = 0;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

主线程一旦进入sleep,就会暂停所有的渲染和交互操作,直到sleep结束,所以屏幕才会冻结,这根本不是你想要的“暂停后自动继续”的效果。

正确的实现方式

我们需要用状态标记+时间跟踪的方式,让游戏在不阻塞主线程的前提下完成暂停等待。这里给你两种常用的方案:

方案1:基于游戏循环的时间计数器(推荐)

这是游戏开发里处理暂停的标准做法,核心是用一个标记变量记录是否暂停,再用时间戳跟踪暂停时长:

  1. 先定义几个全局/类级别的变量:
private boolean isPaused = false;
private long pauseStartTime = 0;
private static final long PAUSE_DURATION = 1000; // 暂停1秒
  1. 在触发暂停的逻辑里,标记状态并记录开始时间:
if (Var.tropfeny > 760) {
    // 先执行你的重置逻辑
    Var.tropfeny = -10;
    Var.tropfenx = Var.n1;
    Var.playerPoints = 0;
    // 开启暂停状态
    isPaused = true;
    pauseStartTime = System.currentTimeMillis();
}
  1. 在游戏的主循环里,处理暂停逻辑:
// 游戏主循环的核心部分
public void gameLoop() {
    while (gameRunning) {
        if (isPaused) {
            // 计算已经暂停的时长
            long elapsedPauseTime = System.currentTimeMillis() - pauseStartTime;
            if (elapsedPauseTime >= PAUSE_DURATION) {
                // 暂停时间到,恢复游戏
                isPaused = false;
            }
            // 暂停期间只渲染(可选:渲染暂停提示),不更新游戏逻辑
            render(); // 保持画面刷新,避免窗口无响应
            continue;
        }
        
        // 正常的游戏逻辑更新
        updateGameLogic();
        // 正常渲染画面
        render();
    }
}

方案2:用单独线程处理延迟(适合简单场景)

如果你想用线程来处理延迟,一定要在独立线程里执行sleep,绝对不能阻塞主线程:

// 确保isPaused是线程安全的,用volatile修饰
public static volatile boolean isPaused = false;

// 触发暂停的逻辑
if (Var.tropfeny > 760) {
    Var.tropfeny = -10;
    Var.tropfenx = Var.n1;
    Var.playerPoints = 0;
    isPaused = true;
    
    // 启动新线程处理延迟
    new Thread(() -> {
        try {
            Thread.sleep(1000);
            // 时间到后恢复游戏
            isPaused = false;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}

然后在游戏主循环里判断状态:

public void gameLoop() {
    while (gameRunning) {
        if (isPaused) {
            render(); // 保持渲染,避免窗口无响应
            continue;
        }
        
        updateGameLogic();
        render();
    }
}

关键注意事项

  • 永远不要在游戏的主线程(UI/渲染线程)调用Thread.sleep(),这是窗口无响应的根源
  • 用状态标记(比如isPaused)管理游戏状态,是最稳妥的做法
  • 如果涉及多线程,一定要保证变量的线程安全(比如用volatile或者同步机制)

内容的提问来源于stack exchange,提问作者Munter3D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:37:54