【问题标题】: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");
}

【讨论】:

  • 谢谢你的回答,我会努力实现的
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 2013-10-29
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多