我目前正在用java实现一个quoridor游戏,使用AI游戏算法。在“人类”点击移动后,gui需要更新,AI开始思考。我在面板里有类似这样的东西:
public void mouseClicked(MouseEvent e)
{
gameBoard.executeMove( movePawn );
repaint();
gameboard.callAi();
}在调用函数callAi()之后,我进入了一个耗费太多时间才能完成的循环中。另一方面,gui冻结,它不更新,即使在AI“开始思考”之前调用了重绘方法。我试着在呼叫AI之前延迟一下,但它不起作用。我写了这个:
try
{ TimeUnit.MILLISECONDS.sleep(5);}
catch{}我能做些什么来解决这个问题?也许这与线程有关,但我对Java中的线程并不是很友好。
发布于 2017-07-13 17:26:06
我强烈建议阅读一下什么是EDT (Event Dispatch Thread)。
Java Event-Dispatching Thread explanation
其中一个答案很好地解释了这一点。Quick TLDR:基本上,图形用户界面冻结的原因之一是因为您在EDT中包含的AI方法(关于gameBoard.executeMove(...),我不能肯定地说)方法)。EDT用于更新GUi,而不是运行耗费大量计算时间的方法。
将游戏逻辑代码从GUI中取出并放入主线程/新线程(而不是EDT)。如果您绝对需要在EDT中使用游戏逻辑,那么在EDT中创建一个新的线程,让它进行游戏计算,最后使用Swing.Utilties.invokeLater(...)方法来更新GUI。
也许它与线程有关,但我对
中的线程并不是很友好。
当你做游戏的时候,一定要熟悉线程,尤其是EDT。
发布于 2017-07-13 18:50:59
你应该使用SwingWorker来完成这方面的AI工作。所有的更新和处理都是在Swing中的一个线程上进行的,所以如果你阻塞它,那么你就会冻结UI。
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
https://stackoverflow.com/questions/45069984
复制相似问题