Mal nebenbei: Wenn da ein Thread.sleep(1); drinsteht und das ganze 1000 gemacht wird, ergibt DAS allein schon 1 Sekunde. Aber ein Thread.sleep(1) kann/muss ja nicht wirklich 1ms sleepen. Sooo genau ist das nicht.
Wie schon angedeutet wurde: Wenn man sowas macht wie
for (int i=0; i<1000; i++) {
someComponent.repaint();
}
dann wird das ganze nur wenige Millisekunden dauern, und danach wird die Component vielleicht EIN mal neu gezeichnet. (Oder auch mehrmals, das weiß man nicht, aber sicher nicht 1000 mal).
@Unregistered: Da muss man einige Dinge berücksichtigen. Es gibt mindestens 2 IMHO sinnvolle Interpretationen von “FPS”. Entweder man berechnet die “theoretischen” FPS aus der Zeit, die benötigt wird, um “alles zu zeichnen”
void draw()
{
long before = System.nanoTime();
drawEverything();
long after = System.nanoTime();
fps = compute(before, after);
}
oder man berechnet die “echten” FPS, indem man mitzählt, wie oft pro Sekunde neu gezeichnet wird
long previous = System.nanoTime();
void draw()
{
drawEverything();
long current = System.nanoTime();
fps = compute(previous, current);
previous = current;
}
Beides hat einige caveats. Beim ersten weiß man im Endeffekt nicht, ob Zeichenbefehle, die in “drawEverything” ausgeführt werden, vielleicht noch irgendwie gepuffert werden (bzw. ob dann noch was passieren muss, bis die Daten wirklich auf dem Bildschirm zu sehen sind). Beim zweiten weiß man nicht, ob der limitierende Faktor das zeichnen ist, oder schlicht die Tatsache, dass ‘draw’ nicht oft genug aufgerufen wird.
Dazu kommt noch, dass Swing schon sehr weit von der Zeichen-Pipeline abstrahiert. Mit OpenGL ohne Vsync kriegt man solche Zahlen hin, aber durch die Hardwareunabhängigkeit ist Swing prinzipedingt eine viel dickere Abstraktionsschicht, und da “richtige” oder auch nur “sinnvolle” FPS zu messen kann etwas fummeliger sein…