0

我正在开发一个处理工作线程上的画布绘图的小型 Android 游戏。游戏结束后,该线程应该开始下一个活动,但不知何故,UI 线程似乎因启动新功能而被阻塞。

这是我的游戏主循环:

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}

该函数performTick()处理游戏逻辑并null在游戏结束时返回。 draw()进行渲染。两个函数都工作得很好——问题是lose(),它除了开始一个新的活动之外什么都不做:

    protected void lose() {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(_context, MainMenu.class);
                _context.startActivity(intent);
            }
        });
    }

游戏结束时,新的 Activiy (MainMenu) 正常启动,但不会对任何触摸事件做出反应。没有 LogCat 输出,也没有发生异常。更糟糕的是,lose()在主循环开始之前调用它时可以正常工作。

我已经为此工作了好几天了。我尝试直接从工作线程启动活动(不使用Handlerin lose())并在互联网上搜索了几个小时 - 没有任何帮助。似乎 UI 线程以某种方式被阻塞或陷入无限循环,我不知道如何解决这个问题。

一切都在 Nexus 4 设备上调试。

顺便说一句:MainMenu.onCreate()以另一种方式启动时工作正常。

请帮忙,MA3o

4

2 回答 2

0

当 if 语句为真时,您不会解锁画布。Break 会让你暂时离开,让画布锁定。

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }

     // this line won't be executed whether the if statement above is true
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}

您也应该在 if 语句中解锁(在 loss() 之前或之后)。

于 2014-06-02T21:59:27.477 回答
0

取而代之的是,如果While(true)您可以在游戏应该运行时设置为 true 的布尔值While(myVar)where并在您调用时设置为 false在您的情况下,尽管您不需要这样做,但您继续绘制。myVarlose()

于 2014-06-02T22:02:11.913 回答