当前位置: 首页 > 知识库问答 >
问题:

Android - 暂停和恢复线程使我的线程变慢

贲言
2023-03-14

我正在 Canvas 中创建一个示例游戏到表面视图中。

我正在使用更新和绘图方法,所有工作。现在我试图暂停并恢复游戏。我在网上找到的方法奏效了,但是当游戏恢复时,它要慢得多。

我的循环游戏:


    while(playing){  // on runnable thread
       update(); // update all objects of the game
       draw();  //  draw all objects of the game
       control();  // first remove dead objects, after sleep the Thread.
    }

我的暂停和恢复方法是:


    public void pause(){
        playing = false;
        try{
            gameThead.sleep(17);
        } catch(ex){};
    }

    public void resume(){
        playing = true;
        gameThread = new gameThread(this); // this object is a runnable
        gameThread.start();
    }

有人知道为什么慢下来吗?以及解决方案?(注:我试图给出一个固定的睡眠而不是变量,结果是同样的慢)

谢谢。

@编辑

我发现了问题。

我的活动在Resume()上有一个监听器,这会启动线程初始化……但在我的surfaceview构造上,我也会这样做……继续:当游戏开始时,有2个线程……暂停不要让游戏太慢,暂停会让游戏以正确的速度进行……开始游戏会让游戏有2个(和2个更新)线程

谢谢。

共有1个答案

苏宜人
2023-03-14

如果play为false,则无需sleep线程,您可以这样做:

// my thread
while(playing && !paused){  // on runnable thread
   update(); // update all objects of the game
   draw();  //  draw all objects of the game
   control();  // first remove dead objects, after sleep the Thread.
}

public void pause(){
    paused = true;
}

public void resume(){
    paused = false;
}

public void quit() {
    playing = false;
}

我认为您最初的问题是这个代码:

    gameThread = new gameThread(this); // this object is a runnable
    gameThread.start();

每次你“恢复”游戏时,你都在创建一个新线程,如果你期望它会暂停很多次,这可能是一个内存密集型习惯(根据睡眠的长度()来判断)。试着保持一个线程,只切换标志。

 类似资料:
  • 问题内容: 有没有一种方法可以使用ExecutorService暂停/恢复特定线程? 想象一下,我想停止id == 0的线程(假设为每个线程分配了一个增量ID,直到达到线程池的大小为止)。 过了一会儿,通过按下一个按钮,我想恢复该特定线程,并将所有其他线程保留为当前状态,这些状态可以暂停或恢复。 我在Java文档中发现了PausableThreadPoolExecutor的未完成版本。但这不适合我

  • 问题内容: 我声明我已阅读有关线程的内容,但从未使用过。所以我问你:) 我有两个线程:和,其中管理GUI和逻辑。 我将从开始。 然后在绘制GUI时,我将其暂停,以等待到达X点的run方法。 当到达X点进入run方法时,我暂停并继续。 并共享一些变量来管理GUI和逻辑… 我可以做吗?如果是,如何?:) 问题答案: 使用和方法: -使当前线程等待,直到另一个线程调用 该对象的方法。 -唤醒正在该对象的

  • 问题内容: 我正在用Java Swing编写应用程序。我需要的是一个可以使用图形界面中的按钮停止“阐述”线程的过程。 这里有一个简单的项目专注于我的需求 问题很简单:在实际的应用程序中,用户设置一些选项,然后启动线程,对选定的数据进行详细说明。 我想提供一个“暂停”按钮,以便用户可以暂时停止详细说明并进行必要的检查,然后可以恢复操作。 我编码的方式是停止的图形线程,而不是“精化”线程。 如果运行示

  • 嗨,我在camel中有一个JMS消费者路由,我的要求是在特定事件时停止/暂停该路由(基于某个字段值),然后使用调度器恢复该路由。为此,我创建了两个路由,一个是我的原始jms消费者路由,另一个是调度程序路由,它们恢复jms消费者路由,虽然我能够暂停路由,但第二个路由不恢复暂停的路由,它显示的状态为已启动。 以下是我的两条路线 请帮助我如何实现上述场景。

  • 当onPause发生时,我的线程没有停止,导致“线程已启动”logcat错误onResume,因为我无法运行两个线程实例。此时如何终止线程?我认为我需要做一些事情,比如: 但是我不能把它添加到我的气球基本暂停中,我认为上下文是错误的。所以请帮忙,代码如下所示。(代码示例会很有帮助,谢谢) 我的活动: 我的表面视图: 我的线程:公共类 GameLoopThreadBasic 扩展线程 { 私有游戏视

  • 有没有办法使用ExecutorService暂停/恢复特定线程? 想象一下,我想停止id=0的线程(假设为每个线程分配了一个增量id,直到达到线程池的大小)。 过了一会儿,按下一个按钮,比如说,我想恢复那个特定的线程,并让所有其他线程保持其当前状态,可以暂停或恢复。 我在Java文档中发现了PausableThreadPoolExecutor的一个未完成版本。但它不适合我的需要,因为它会恢复池中的