java俄罗斯方块 按键迟钝 最近在学java,做了一个俄罗斯方块小游戏,但是遇到一点小问题,就是,如果线程 sleep 时间过长,按键就反应迟钝,如果过短,游戏就没法玩了,请教高手怎么解决啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果线程 sleep 时间过长,按键就反应迟钝,如果过短,游戏就没法玩了你可以设置下睡眠的时间啊 你应该设置的时间都在两端了 还有仔细检查下你的线程 你需要定时控制的应该只有方块的自动下落这个算法而已下落算法写在一个线程或者定时器中每多少秒下落一次,并repaint平时有操作时也repaint这样就不会有什么反应慢的问题听你这么形容,你肯定是只有下落时才repaint了 你可能是把事件响应部分代码放到了Swing的EDT(事件处理线程)中了,这是不合理的,这种情况会导致你所说的响应迟钝。你应该另起一个线程专门处理。具体可以去搜索SwingWorker EDT 3楼说的像点,我也不太明白,这是我重绘线程的代码private class PaintThread implements Runnable { GameFace gf; PaintThread(GameFace gf) { this.gf = gf; } public void run() { while(true) { //此处产生一个新的 block gf.repaint(); if(!gf.getBlock().fallDown()) { gf.fullDelete(); gf.getBlock().reset(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }//class PaintThread你看下有问题么 private class PaintThread implements Runnable { GameFace gf; PaintThread(GameFace gf) { this.gf = gf; } public void run() { while(true) { //此处产生一个新的 block gf.repaint(); if(!gf.getBlock().fallDown()) { gf.fullDelete(); gf.getBlock().reset(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }//class PaintThread GameFace 继承 Canvas,fallDown()是下落,当不能下落时,返回false而且消去满行,产生下一个新块,按键迟钝应该不是完全是sleep时间长短的问题,我是先读了别人的代码写的,他sleep(1000),时,就不迟钝,很灵敏 建议在run方法内,用System.currentTimeMills()方法打印下各条语句耗时情况。然后根据结果有的放矢地分析。另外多线程处理不当的情况下也有可能导致你说的问题。 gf.repaint(); if(!gf.getBlock().fallDown()) { gf.fullDelete(); gf.getBlock().reset(); }比如上面repaint如果是完全重绘,那么就是个耗时比较长的线程(repaint方法调用肯定要重启一个线程的)。fallDown方法判断是否还可以落下,如果判断的算法效率不高的话,也要消耗不少时间。还有fullDelete和reset方法都有可能要耗不少时间。假设他们各在各的线程(注意我只是假设,实际情况我没看完整代码,所以不能确定)里,那么你不能保证程序实际执行顺序是按照上面语句的先后顺序执行。即先执行完重绘线程,再fallDown,再..。这样4个线程(我假设是4个线程,且这4个线程运行时间分别为t1、t2、t3、t4)如果还共享某些变量的话,而你又未对这些共享变量进行同步互斥处理,可能会出现线程间的资源竞争问题,这样实际运行时间就不是t1+t2+t3+t4,而是大于t1+t2+t3+t4,就可能导致你说的反应迟钝问题了。 哈哈,3 楼说的方法管用,我在每个键盘监听,调用完移动的函数后,加了一个repaint(),就不迟钝了,但不知道这种写法规不规范,谢谢 3 楼啊,也非常感谢 4楼的热心解答,我学到了很多新东西其实前两天用3楼的方法搞定了,但论坛不让连续回复3次 java socket实现两个客户段或多个客户端之间通信 求助关于UIManager.setLookAndFeel的问题!! 自己写了一个框架 烦劳大家下载测试一下 JTabbedpane 验证不通过时,不切换 关于正则表达式 菜虫求一个RLE简单算法代码 如何理解对象的定义? 初学JAVA,问题多多! 在2000下运行的好好的程序为什么到SOLARIS下就会出错呢?希望大家援手!多提意见。 有人知道SCJP的题库怎么更新的么? JTabbedPane新建标签页 菜鸟求救!!!
你可以设置下睡眠的时间啊 你应该设置的时间都在两端了 还有仔细检查下你的线程
SwingWorker EDT
private class PaintThread implements Runnable {
GameFace gf;
PaintThread(GameFace gf) {
this.gf = gf;
}
public void run() {
while(true) {
//此处产生一个新的 block
gf.repaint();
if(!gf.getBlock().fallDown()) {
gf.fullDelete();
gf.getBlock().reset();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}//class PaintThread
你看下有问题么
GameFace gf;
PaintThread(GameFace gf) {
this.gf = gf;
}
public void run() {
while(true) {
//此处产生一个新的 block
gf.repaint();
if(!gf.getBlock().fallDown()) {
gf.fullDelete();
gf.getBlock().reset();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}//class PaintThread
fallDown()是下落,当不能下落时,返回false
而且消去满行,产生下一个新块,按键迟钝应该不是完全是sleep时间长短的问题,我是先读了别人的代码写的,他sleep(1000),时,就不迟钝,很灵敏
另外多线程处理不当的情况下也有可能导致你说的问题。
gf.repaint();
if(!gf.getBlock().fallDown()) {
gf.fullDelete();
gf.getBlock().reset();
}
比如上面repaint如果是完全重绘,那么就是个耗时比较长的线程(repaint方法调用肯定要重启一个线程的)。fallDown方法判断是否还可以落下,如果判断的算法效率不高的话,也要消耗不少时间。还有fullDelete和reset方法都有可能要耗不少时间。假设他们各在各的线程(注意我只是假设,实际情况我没看完整代码,所以不能确定)里,那么你不能保证程序实际执行顺序是按照上面语句的先后顺序执行。即先执行完重绘线程,再fallDown,再..。
这样4个线程(我假设是4个线程,且这4个线程运行时间分别为t1、t2、t3、t4)如果还共享某些变量的话,而你又未对这些共享变量进行同步互斥处理,可能会出现线程间的资源竞争问题,这样实际运行时间就不是t1+t2+t3+t4,而是大于t1+t2+t3+t4,就可能导致你说的反应迟钝问题了。
谢谢 3 楼啊,
也非常感谢 4楼的热心解答,我学到了很多新东西其实前两天用3楼的方法搞定了,但论坛不让连续回复3次