Ich mache ein kleines Java Spiel mit Swing, und bin verwirrt.
Ich habe bisher immer die jpanel.repaint() Methode verwendet zum rendern (momentan sind render und gameloop der gleiche loop). Damit bekomme ich extrem viel fps. Die fps sind aber wohl nicht akkurat, weil ja das painten vom EDT (Event Dispatching Thread) gemacht wird, und der fasst zeitlich nahe beeinander liegende repaints zusammen. Das heißt, die “echten fps” sind sehr viel weniger. Habe dann paintImmediatly benutzt, was mich aber weiterhin stört ist:
-
Angeblich muss man die paintImmediatly vom EDT aus aufrufen. Wie genau geht das? Momentan rufe ich das vom Hauptthread aus auf, und es funktioniert relativ oft (kann aber durchaus scheitern in den ersten Frames)
-
Laut Internet werden Events nicht abgefangen, solange der EDT etwas selbst geschriebenes ausführt. Ich möchte aber da ja in Zukunft meinen render loop unterbringen. Verstehe ich nicht so ganz… falls es von Interesse ist: Alle ankommende Benutzereingaben (Events) werden gespeichert und einmal pro Game loop ausgelesen. Kommen die Events weiterhin an, wenn ich im EDT quasi pausenlos durchrendere?
-
Mit paintImmediatly erhalte ich 2000 fps. Erscheint mir immernoch etwas viel…
Edit: Mein Gameloop:
fpsLimit = 999999;
int frames = 0;
long framesStartTime = System.currentTimeMillis();
long oldTime;
long load = 0;
while (true) {
oldTime = System.currentTimeMillis();
frame.panel.paintImmediately(0, 0, DrawUtil.width, DrawUtil.height);
controls.registerActions(testPlayer);
testPlayer.executeActions(null);
frames++;
long currentTime = System.currentTimeMillis();
if (currentTime > framesStartTime+1000) {
NewTestGame.load = (double)load/1000;
load = 0;
fps = frames;
frames = 0;
framesStartTime = currentTime;
}
if (fpsLimit > 0) {
long duration = currentTime - oldTime;
int targetDuration = 1000/fpsLimit;
long diff = Math.max(0, targetDuration-duration);
load += duration;
//TODO sleep one for more accurate
Thread.sleep(diff);
}
}
Edit2: “load” ist nur eine fancy “Lastberechnung”
z.B. wenn die fps auf 60 gecapt sind, liegt am kern maximal 7% Last an.