2016-12-06 58 views
5

Napisałem prosty program animacyjny Java w Ubuntu 14.4.1. Piłka poruszająca się wewnątrz JPanela. Ale na egzekucji piłka porusza się dość nerwowo w JPanelu. Ten problem trwa, dopóki nie przesunę myszki wewnątrz JPanel. W momencie poruszania myszą wewnątrz JPanel ruch kulki jest dość płynny. Należy powiedzieć, że uruchomiłem ten program w systemie Windows 10 i nie wystąpił problem. Kod mojego programu jest następujący:Programy do animacji Java pracujące w systemie Linux

import java.awt.*; 
import javax.swing.*; 

public class BouncingBall extends JPanel { 
    Ball ball = new Ball(); 

    void startAnimation() { 
     while(true) { 
      try { 
       Thread.sleep(25); 
       ball.go(); 
       repaint(); 
      } catch(InterruptedException e) {} 
     } // end while(true) 
    } // end method startAnimation() 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     ball.draw(g); 
    } // end method paintComponent 


    // inner class Ball 
    class Ball { 
     int x; 
     int y; 
     int diameter = 10; 
     int xSpeed = 100; 
     int ySpeed = 70; 

     void go() { 
      x = x + (xSpeed*25)/1000; 
      y = y + (ySpeed*25)/1000; 

      int maxX = getWidth() - diameter; 
      int maxY = getHeight() - diameter; 
      if(x < 0) { 
       // bounce at the left side 
       x = 0; 
       xSpeed = -xSpeed; 
      } else if(x > maxX) { 
       // bounce at the right side 
       x = maxX; 
       xSpeed = -xSpeed; 
      } else if(y < 0) { 
       // bounce at the top side 
       y = 0; 
       ySpeed = -ySpeed; 
      } else if(y > maxY) { 
       // bounce at the bottom size 
       y = maxY; 
       ySpeed = -ySpeed; 
      } // end if-else block 
     } // end method go() 

     void draw(Graphics g) { 
      g.fillOval(x , y , diameter , diameter); 
     } // end method draw 
    } // end inner class Ball 


    public static void main(String[] args) { 
     JFrame window = new JFrame(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BouncingBall animation = new BouncingBall(); 
     animation.setPreferredSize(new Dimension(500 , 500)); 
     animation.setBackground(Color.white); 
     window.add(animation); 
     window.pack(); 
     window.setVisible(true); 

     animation.startAnimation(); 
    } // end method main 
} // end class BouncingBall 

Na czym polega problem? Czy muszę zmienić niektóre ustawienia w moim Ubuntu? Ja również umieścić jakiś kod testowy wewnątrz metody paintComponent następująco:

protected void paintComponent(Graphics g) { 
    System.out.println("paintComponent call number: " + counter); 
    ++counter; 
    super.printComponent(g); 
    ball.draw(g); 
} 

o zmiennej licznika wartości początkowej 0 zadeklarowanej w klasie MovingBall. Zauważyłem, że liczba wywołań paintComponent na sekundę jest znacznie większa niż rzeczywista częstotliwość odświeżania JPanela, tak jak się wydaje.

+0

println w ramach metody paintComponent spowolni działanie i może mieć zauważalny efekt. Będziesz chciał to stamtąd. –

+0

Główny problem pojawił się przed dodaniem println. Deklaracja println jest tylko instrukcją testowania, aby dowiedzieć się więcej o tym problemie. – Hedayat

+0

Chciałbym również uzyskać przyrosty w czasie rzeczywistym w ramach metody animacji i obliczyć najlepszą pozycję sprite'a na podstawie przyrostów w czasie rzeczywistym. W ten sposób piłka porusza się w tej samej odległości, jeśli animacja jest szybka lub wolna. –

Odpowiedz

6

Przyspieszanie wideo jest domyślnie włączone w systemie Windows, ale nie jest domyślnie włączone w systemie Linux. (Tak było przez wiele lat; Mógłbym przysiąc, to domyślna została zmieniona na ostatnich wydań Java, ale widocznie się myliłem.)

Można enable OpenGL aby przyspieszył wydajność:

public static void main(String[] args) { 
    System.setProperty("sun.java2d.opengl", "true"); 

    JFrame window = new JFrame(); 

Alternatywnie , możesz ustawić właściwość w linii poleceń:

java -Dsun.java2d.opengl=true BouncingBall 
+0

Dziękuję za odpowiedź. Próbowałem obu sposobów, które powiedziałeś. Ale żaden z nich nie naprawił problemu. Animacja jest nadal nierówna, tak jak poprzednio. – Hedayat

+0

Ta właściwość zrobiła dla mnie ogromną różnicę. Jaka jest karta graficzna Twojego systemu Linux? Czy wiesz, czy zapewnia przyspieszenie OpenGL? – VGR

+0

Nie wiem zarówno o karcie graficznej, jak i obsłudze OpenGL. Jak mogę o nich zrozumieć? – Hedayat