Java 多边形变化的实时响应
我对重绘函数或我的实现有问题 一个KeyListener(awt)连接到我的画布上,我想立即更新多边形的位置,但当我按下按钮半秒钟左右时,它会出现问题。所以它的反应不是很快Java 多边形变化的实时响应,java,opengl,jogl,Java,Opengl,Jogl,我对重绘函数或我的实现有问题 一个KeyListener(awt)连接到我的画布上,我想立即更新多边形的位置,但当我按下按钮半秒钟左右时,它会出现问题。所以它的反应不是很快 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_W) { testBox.goVertical(1); }
@Override
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_W)
{
testBox.goVertical(1);
}
if (keyCode == KeyEvent.VK_S)
{
testBox.goVertical(-1);
}
if (keyCode == KeyEvent.VK_A)
{
testBox.goHorizontal(-1);
}
if (keyCode == KeyEvent.VK_D)
{
testBox.goHorizontal(1);
}
testBox.calculatePosition();
canvas.repaint(1);
}
这是我按键的方法。它更新一个名为TestBox的类的实例。
在此方法中,我希望重新计算多边形的位置:
[..]
private float vertical_speed;
private float horizontal_speed;
private long lastTimestamp;
public void calculatePosition()
{
if (lastTimestamp != 0)
{
long newTimestamp = System.nanoTime();
position_y += (newTimestamp - lastTimestamp) * 0.1 / 1000 * vertical_speed;
position_x += (newTimestamp - lastTimestamp) * 0.1 / 1000 * horizontal_speed;
System.out.println(newTimestamp - lastTimestamp);
}
lastTimestamp = System.nanoTime();
}
public void goVertical(float speed)
{
vertical_speed = speed;
lastTimestamp = System.nanoTime();
}
public void goHorizontal(float speed)
{
horizontal_speed = speed;
lastTimestamp = System.nanoTime();
}
[..]
System.print显示此信息列表:
3687
527
527
527
为什么会出现3687纳米级
我在维护画布的类的构造函数中将动画设置为每秒60帧:
canvas.getAnimator().setUpdateFPSFrames(60, null);
你能帮我吗?只需观察一下,对底层的本机资源和画布进行重新绘制(1)如果你有动画师,就不需要代码>我应该用什么来代替awt keyListener?但是如果你需要一个gui,它可能会有问题,是吗?那么我会说,现在就坚持使用awt。通过调用
gl.glSetSwapInterval(0)
,设置animator.runasfastasposable(true)
禁用init()
中的vsync,并检查在按住按钮一秒钟或不调用repaint()时调用函数calculatePosition()
的频率,请使用最简单的animator(不要使用FPSAnimator)。无需立即更新多边形,因为动画师已经定期调用GLAutoDrawable.display()。您应该学习一些3D引擎中如何管理关键事件,特别是JogAmp的Ardor3D延续(我维护的).Input和rendering是分开的。只需对底层本机资源和画布进行一次观察。如果您有动画师,则不需要重新绘制(1);
,我应该使用什么来代替awt keyListener?,但如果您需要gui,则可能会出现问题,是吗?然后我会说暂时使用awt。在init()中禁用vsync
通过调用gl.glSetSwapInterval(0)
,设置animator.runasfastasposable(true)
并检查当您按住按钮一秒钟或不调用repaint()时调用函数calculatePosition()
的频率,请使用最简单的animator(不要使用FPSAnimator)。无需立即更新多边形,因为动画师已经定期调用GLAutoDrawable.display()。您应该学习一些3D引擎中如何管理关键事件,特别是JogAmp的Ardor3D延续(我维护)。输入和渲染是分开的。