【问题标题】:Java Applet slows down when mouse is moved移动鼠标时 Java Applet 变慢
【发布时间】:2012-03-31 16:35:33
【问题描述】:
我有一个带有线程、MouseListerner 和 MouseMotionListener 的 Java Applet。
当鼠标被拖动时,小程序上会画一些东西,然后它会掉下来。
这确实有效,但是当鼠标移动而不按下时,下落的物体不会流畅地移动。
线程调用重绘函数
while(running){
repaint();
}
mouseMoved 函数为空,mouseDragged 调用重绘。
希望有人知道这个问题,谢谢
【问题讨论】:
-
1) while(running){ repaint(); } 不要在没有wait() 的情况下这样做 2) 为了尽快获得更好的帮助,请发布SSCCE。 3)这个千年,使用 Swing 而不是 AWT 组件。 4) 这应该是从使用Java Web Start 的链接启动的框架(而不是嵌入式小程序,这更棘手)。
标签:
java
event-handling
applet
【解决方案1】:
您的主线程正在(不必要地)占用 CPU。由于您不需要每 40 毫秒更快的更新,也许每 80 毫秒就足够了,您应该将主循环重新设计为:
/**
* internal game loop method.
*/
public void updateGameState() {
lastFrameTime = System.currentTimeMillis();
// as long as we run we move
while (state == GameState.RUNNING) {
currentFrame++;
timeNow = System.currentTimeMillis();
// sleep until this frame is scheduled
long l = lastFrameTime + FRAME_DELAY - timeNow;
updatePositions();
redraw();
//System.err.println("............. delay:" + l);
if (l > 0L) {
try {
Thread.sleep(l);
}
catch (Exception exception) {
}
} else {
// something long kept us from updating, reset delays
lastFrameTime = timeNow;
l = FRAME_DELAY;
}
//System.err.println("lft: " + lastFrameTime + " tn: " + timeNow);
lastFrameTime = timeNow + l;
// be polite, let others play
Thread.yield();
}
///System.err.println("leave game loop");
}