2012-03-31 2 views
0

У меня есть Java-апплет с потоком, MouseListerner и MouseMotionListener.Java-апплет замедляется при перемещении мыши

Когда мышь перетаскивается, что-то нарисовано на апплете, а затем оно падает. Это работает, но когда мышь перемещается и не нажата, падающий объект не перемещается свободно.

Нить вызывает функцию перекрашивать

while(running){ 
    repaint(); 
} 

Функция mouseMoved пуста, mouseDragged звонки перекрашивать. Надеюсь, что кто-то знает эту проблему, спасибо

+1

1) 'в то время как (бег) {перекрасить(); } 'Не делайте этого без' wait() '2). Для получения более эффективной помощи опубликуйте [SSCCE] (http://sscce.org/). 3) В этом тысячелетии используйте компоненты Swing, а не AWT. 4) Вероятно, это должен быть кадр, запущенный из ссылки, используя [Java Web Start] (http://stackoverflow.com/tags/java-web-start/info) (а не встроенный апплет, что сложнее). –

ответ

1

Вы зацикливаете CPU (nonecesaruly) с помощью основной темы. Так как вам не нужно обновление быстрее, чем через каждые 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"); 
} 
+0

Спасибо за ваши ответы, я попытаюсь их реализовать – user1305241