100%的cpu,因为这个线程是java
我刚刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康会下降。问题是,当我检查这个,CPU是在100%,一切都很滞后。这是一个问题。以下是我正在使用的线程:100%的cpu,因为这个线程是java,java,Java,我刚刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康会下降。问题是,当我检查这个,CPU是在100%,一切都很滞后。这是一个问题。以下是我正在使用的线程: package Graphics; import java.util.logging.Level; import java.util.logging.Logger; public class BulletCollision implements Runnable { Player1 player1 =
package Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BulletCollision implements Runnable {
Player1 player1 = new Player1();
Player2 player2 = new Player2();
public Thread checkBulletCollision = new Thread(this);
public void checkPlayerBulletCollide() {
if (player2.getBulletX() > player1.getX() &&
player2.getBulletX() < player1.getX() - 50) {
player2.decHealth(50);
}
}
@Override
public void run() {
while(true) {
checkPlayerBulletCollide();
try {
checkBulletCollision.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(
Level.SEVERE, null, ex);
}
}
}
}
封装图形;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类BulletCollision实现可运行{
Player1 Player1=新的Player1();
Player2 Player2=新的Player2();
公共线程checkBulletCollision=新线程(此);
公共无效checkPlayerBulletCollide(){
如果(player2.getBulletX()>player1.getX()&&
player2.getBulletX()
我很确定这就是问题所在。编译或运行时没有错误。如果有人能帮上忙,那就太棒了!我只是创建了这个类,所以代码并不完美。为了解决这个问题,我做了很多尝试,在我的Display类中调用了Threads start()方法,它只显示JFrame。我以前在我的一个球员分类中使用了start方法 在我看来,在这种情况下,在单独的线程中使用此无块运行是不正确的
while(true) {
checkPlayerBulletCollide();
try {
checkBulletCollision.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
}
}
每帧只执行一次,我会从绘图逻辑调用checkPlayerBulletCollide()
还要注意的是,Thread.sleep()
是一个静态函数,所以你不能让一个特定的线程实例从另一个线程进入睡眠状态,Threac只能让自己进入睡眠状态
编辑如果您想编写简洁明了的代码(这非常好),我建议您使用Java 1.5上的锁定机制
即使这不是轻量级的ebough(在当前2个用户各有1个项目符号的情况下),我还是会使用一个。检查线程必须发出queue.take(),但实际的整数值无关紧要(稍后,例如,如果有更多项目符号或播放器,您可以在队列中放置对象,指定要检查的项目符号和用户…)。绘图逻辑-或控制绘图的逻辑将执行queue.offer(0)。检查线程如下所示:
public class BulletCollision implements Runnable{
Player1 player1 = new Player1();
Player2 player2 = new Player2();
public BlockingQueue<Integer> checkQueue = new LinkedBlockingQueue<Integer>();
public void checkPlayerBulletCollide() {
if(player2.getBulletX() > player1.getX() && player2.getBulletX() < player1.getX() -50) {
player2.decHealth(50);
}
}
@Override
public void run() {
while(true) {
try {
queue.take();
checkPlayerBulletCollide();
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
break; //I'd put this here. If we were interrupted, the hread should stop gracefully.
}
}
}
}
公共类BulletCollision实现可运行{
Player1 Player1=新的Player1();
Player2 Player2=新的Player2();
public BlockingQueue checkQueue=新建LinkedBlockingQueue();
公共无效checkPlayerBulletCollide(){
如果(player2.getBulletX()>player1.getX()&&player2.getBulletX()
另外,当你画完一个框架后,你应该发出一个
queue.offer(0)代码>问题不在此代码中。有一个或两个缺陷,但在这段代码中没有任何会导致滞后。。。据我所知
FWIW,缺陷如下:
1) 这是一种糟糕的风格:
checkBulletCollision.sleep(100);
Thread.sleep
方法是静态的,因此您应该如下调用它:
Thread.sleep(100);
2) 如果线程run()
方法收到中断,它应该返回。你已经把它编码好了,可以继续。。。如果你需要更多的细节,比如我的类的层次结构,所有的方法,int等都是从那里来的,那就去问吧。但我认为没必要。你试过使用剖面仪吗?不,图纸不是逻辑。将动画隔离到模型中,且绘图必须仅为绘图。@Aubin我理解您在将业务逻辑与视觉分离方面所做的努力-这很好。但有时性能要求迫使我们使用不太清晰的解决方案(DB表的非规范化就是其中之一)。我会用更好的方法更新我的答案。你的意思是只使用这个方法而不使用新线程吗?因为无论哪种方式都需要100%cpu@user1776707瓶颈也可能在其他地方。。如果你能在这里粘贴一些代码。。稍后我可以看一看。你能帮我解决另一个问题吗?你能帮我了解bulletX的价值吗?在上面的代码中,bullet x受int bullet x保护,player2扩展了具有int的类。但是从上面的类中,bullet x的值始终为0?为什么会这样?