Java - 应用程序在 Thread.sleep 方法上崩溃
Java - Application crashed on Thread.sleep method
我有一个让我的怪物走路的功能。它将能够随机选择方向和距离,并在被召唤时移动怪物。现在我在渲染方法中的每一帧都调用了该方法:
for(Monster monster : monsters) {
renderer.processEntity(monster);
monster.monsterWalk();
}
到目前为止这很好,但是它让怪物摇晃,因为它正在快速选择值,我想让它移动到某个地方,等待 5 秒,然后再决定移动到哪里。
我的问题是当我添加 Thread.sleep(x) 方法时,屏幕变黑并且程序变得无响应。
这是步行方法:
public void monsterWalk() {
//Make direction decision
Random random = new Random();
switch(random.nextInt(4)) {
case 0:
setPosition(new Vector3f(position.x, position.y, position.z += mobSpeed)); //forward
break;
case 1:
setPosition(new Vector3f(position.x, position.y, position.z -= mobSpeed)); //backward
break;
case 2:
setPosition(new Vector3f(position.x += mobSpeed, position.y, position.z)); //right
break;
case 3:
setPosition(new Vector3f(position.x -= mobSpeed, position.y, position.z)); //left
}
try {
Thread.sleep(random.nextInt(5000) + 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我自己没有使用过 LWJGL,但是在我见过的几乎每个 UI 框架中,都有一个线程是为 UI 操作保留的:
- 您不得在任何其他线程上执行 UI 操作
- 您不得将该线程占用任何重要时间,因为 UI 在被阻塞时无法刷新
在您的代码中,您正在调用 Thread.sleep
,它会在该时间段内阻塞线程 - 如果您在 UI 线程上执行此操作(并且如果 LWJGL 的工作方式与那些其他框架)然后你阻止UI在阻塞时刷新。
要定期执行操作,您应该使用某种计时器。棘手的部分是您希望计时器在 UI 线程 中触发 。大多数框架为此提供某种专门的支持(例如 Swing Timer
),但我不知道 LWJGL 是否提供。希望这些信息足以让您开始在 LWJGL 中寻找最佳方法。
我注意到 LWJGL timing documentation 稍微谈到了这种事情,但完全 不一样。 (它也指的是 Display.sync
,我在 Javadoc 中找不到,所以它可能指的是旧版本。)
我有一个让我的怪物走路的功能。它将能够随机选择方向和距离,并在被召唤时移动怪物。现在我在渲染方法中的每一帧都调用了该方法:
for(Monster monster : monsters) {
renderer.processEntity(monster);
monster.monsterWalk();
}
到目前为止这很好,但是它让怪物摇晃,因为它正在快速选择值,我想让它移动到某个地方,等待 5 秒,然后再决定移动到哪里。
我的问题是当我添加 Thread.sleep(x) 方法时,屏幕变黑并且程序变得无响应。
这是步行方法:
public void monsterWalk() {
//Make direction decision
Random random = new Random();
switch(random.nextInt(4)) {
case 0:
setPosition(new Vector3f(position.x, position.y, position.z += mobSpeed)); //forward
break;
case 1:
setPosition(new Vector3f(position.x, position.y, position.z -= mobSpeed)); //backward
break;
case 2:
setPosition(new Vector3f(position.x += mobSpeed, position.y, position.z)); //right
break;
case 3:
setPosition(new Vector3f(position.x -= mobSpeed, position.y, position.z)); //left
}
try {
Thread.sleep(random.nextInt(5000) + 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我自己没有使用过 LWJGL,但是在我见过的几乎每个 UI 框架中,都有一个线程是为 UI 操作保留的:
- 您不得在任何其他线程上执行 UI 操作
- 您不得将该线程占用任何重要时间,因为 UI 在被阻塞时无法刷新
在您的代码中,您正在调用 Thread.sleep
,它会在该时间段内阻塞线程 - 如果您在 UI 线程上执行此操作(并且如果 LWJGL 的工作方式与那些其他框架)然后你阻止UI在阻塞时刷新。
要定期执行操作,您应该使用某种计时器。棘手的部分是您希望计时器在 UI 线程 中触发 。大多数框架为此提供某种专门的支持(例如 Swing Timer
),但我不知道 LWJGL 是否提供。希望这些信息足以让您开始在 LWJGL 中寻找最佳方法。
我注意到 LWJGL timing documentation 稍微谈到了这种事情,但完全 不一样。 (它也指的是 Display.sync
,我在 Javadoc 中找不到,所以它可能指的是旧版本。)