Ik heb een probleem met JAVA. Ik ben bezig met een project voor school, waarin wij een animatie moeten tekenen. Het viel mij op een gegeven moment op dat de animatie alles behalve soepel liep op twee Linux laptops in onze project groep. De snelste machine van de twee is een 1GHz duron. Ik heb hetzelfde programma daarna onder Windows geprobeerd, op een 366MHz (niet lachen) laptop. Wat mij opviel was dat dat animatie een stuk vloeiender en strakker verliep dan in Windows. Zelfs in vergelijking met Linux op een 1GHz systeem!
Ik heb daarna thuis nog eens onderzocht wat de oorzaak precies was. Ik kwam er achter dat wanneer ik met mijn muis in het venster beweeg, de animatie ineens soepel loopt (net zo soepel als in Windows). Het programma registreert overigens geen mouse movements.
Ik heb een klein test programma gemaakt, zodat jullie zelf kunnen zien wat ik bedoel.
Compileren met:
Runnen met:
Laat de animatie eerst even lopen zonder met je muis te bewegen. Volg daarna langzaam met je muis de lijn van de cirkel in het midden van het venster. Let nu ondertussen weer op de animatie.
Wanneer de muis met rust gelaten wordt, lijkt het redrawen met variabele intervallen te gaan. Ik heb met getTime() (niet het meest nauwkeurige nee) gecontroleerd hoeveel tijd elke frame (vanaf de sleep()) er over doet, maar de waarden zijn vrij stabiel (scheelt af en toe een miliseconde of 2).
Kan iemand vertellen waarom de animatie zo slecht loopt, tenzij er muis activiteit plaatsvindt? Het lijkt mij alsof de mainloop van JAVA erg onnauwkeurig is ofzo.
Ik heb daarna thuis nog eens onderzocht wat de oorzaak precies was. Ik kwam er achter dat wanneer ik met mijn muis in het venster beweeg, de animatie ineens soepel loopt (net zo soepel als in Windows). Het programma registreert overigens geen mouse movements.
Ik heb een klein test programma gemaakt, zodat jullie zelf kunnen zien wat ik bedoel.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| import java.awt.*; import javax.swing.JFrame; /** * Draws a bouncing line */ class DrawSurface extends Component implements Runnable { double y; double angle; public DrawSurface() { new Thread(this).start(); } public void paint(Graphics g) { g.drawRect(1,(int)(getHeight()-y*getHeight()),100,1); g.drawOval( 5, 50, 80,80 ); } public void run() { while ( true ) { try { Thread.sleep(30); } catch (InterruptedException ex) { System.err.println("beetje vervelend"); } if ( angle++ > 180 ) angle = 0; y = Math.sin( Math.toRadians(angle) ); repaint(); } } } /** * Main Class */ class TheApp extends JFrame { DrawSurface draw = new DrawSurface(); public TheApp() throws HeadlessException { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } setBounds(100, 100, 100, 200); } public static void main(String[] args) throws HeadlessException { TheApp theApp1 = new TheApp(); theApp1.show(); } private void jbInit() throws Exception { this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.getContentPane().add(draw, BorderLayout.CENTER); } } |
Compileren met:
code:
1
| javac TheApp.java |
Runnen met:
code:
1
| java TheApp |
Laat de animatie eerst even lopen zonder met je muis te bewegen. Volg daarna langzaam met je muis de lijn van de cirkel in het midden van het venster. Let nu ondertussen weer op de animatie.
Wanneer de muis met rust gelaten wordt, lijkt het redrawen met variabele intervallen te gaan. Ik heb met getTime() (niet het meest nauwkeurige nee) gecontroleerd hoeveel tijd elke frame (vanaf de sleep()) er over doet, maar de waarden zijn vrij stabiel (scheelt af en toe een miliseconde of 2).
Kan iemand vertellen waarom de animatie zo slecht loopt, tenzij er muis activiteit plaatsvindt? Het lijkt mij alsof de mainloop van JAVA erg onnauwkeurig is ofzo.
[ Voor 3% gewijzigd door Remenic op 26-05-2004 23:17 ]