frame rate - JAVA simple fps animation(how can i work with?) -
can me, how can calculate , show fps in animation? want show simple rect (for example).
if have code:
private final fps = 30; private final size = 10; private int x = 10; private int y = 0; private string myfps; private void start(){ while(true){ moverect(); paint(); } } private void paint(){ g2.drawrect(x, y, size, size); g2.drawstring(myfps, 10, 10); } private void moverect(){ x++; }
here copypaste of old simple java graphics+bufferstrategy gameloop test app. animation loop draws few moving rectangles , fps counter.
java -cp ./lib/test.jar gameloop2 "fullscreen=false" "fps=60" "vsync=true"
//http://www.javagaming.org/index.php/topic,19971.0.html //http://fivedots.coe.psu.ac.th/~ad/jg/ch1/ch1.pdf import java.util.*; import java.awt.color; import java.awt.frame; import java.awt.graphics; import java.awt.graphicsconfiguration; import java.awt.graphicsdevice; import java.awt.graphicsenvironment; import java.awt.toolkit; import java.awt.event.keyevent; import java.awt.event.keylistener; import java.awt.geom.rectangle2d; import java.awt.image.bufferstrategy; import java.awt.displaymode; // full-screen mode public class gameloop2 implements keylistener { frame mainframe; private static final long nano_in_milli = 1000000l; // num of iterations sleep delay of 0ms before // game loop yields other threads. private static final int no_delays_per_yield = 16; // max num of renderings can skipped in 1 game loop, // game's internal state updated not rendered on screen. private static int max_render_skips = 5; private static int target_fps = 60; //private long prevstatstime; private long gamestarttime; private long currendertime; private long rendersskipped = 0l; private long period; // period between rendering in nanosecs long fps; long framecounter; long lastfpstime; rectangle2d rect, rect2, rect3; /** * create new gameloop use specified graphicsdevice. * * @param device */ public gameloop2(map<string,string> args, graphicsdevice device) { try { if (args.containskey("fps")) target_fps = integer.parseint(args.get("fps")); // setup frame graphicsconfiguration gc = device.getdefaultconfiguration(); mainframe = new frame(gc); //mainframe.setundecorated(true); mainframe.setignorerepaint(true); mainframe.setvisible(true); mainframe.setsize(640, 480); //mainframe.setlocationrelativeto(); mainframe.setlocation(700,100); mainframe.createbufferstrategy(2); mainframe.addkeylistener(this); if ("true".equalsignorecase(args.get("fullscreen"))) { device.setfullscreenwindow(mainframe); device.setdisplaymode(new displaymode(640, 480, 8, displaymode.refresh_rate_unknown)); } final boolean vsync = "true".equalsignorecase(args.get("vsync")); // cache buffer strategy , create rectangle move bufferstrategy bufferstrategy = mainframe.getbufferstrategy(); rect = new rectangle2d.float(0,100, 64,64); rect2 = new rectangle2d.float(0,200, 32,32); rect3 = new rectangle2d.float(500,300, 128,128); // loop initialization long beforetime, aftertime, timediff, sleeptime; long oversleeptime = 0l; int nodelays = 0; long excess = 0l; gamestarttime = system.nanotime(); //prevstatstime = gamestarttime; beforetime = gamestarttime; period = (1000l*nano_in_milli)/target_fps; // rendering fps (nanosecs/targetfps) system.out.println("fps: " + target_fps + ", vsync=" + vsync); system.out.println("fps period: " + period); // main loop while(true) { // **2) execute physics updateworld(0); // **1) execute drawing graphics g = bufferstrategy.getdrawgraphics(); drawscreen(g); g.dispose(); // synchronise display hardware. note on // windows vista method may cause screen flash. // if bothers you, comment out. if (vsync) toolkit.getdefaulttoolkit().sync(); // flip buffer if( !bufferstrategy.contentslost() ) bufferstrategy.show(); aftertime = system.nanotime(); currendertime = aftertime; calculateframespersecond(); timediff = aftertime - beforetime; sleeptime = (period-timediff) - oversleeptime; if (sleeptime > 0) { // time left in cycle //system.out.println("sleeptime: " + (sleeptime/nano_in_milli)); try { thread.sleep(sleeptime/nano_in_milli);//nano->ms } catch(interruptedexception ex){} oversleeptime = (system.nanotime()-aftertime) - sleeptime; } else { // sleeptime <= 0; system.out.println("rendering slow"); // cycle took longer period excess -= sleeptime; // store excess time value oversleeptime = 0l; if (++nodelays >= no_delays_per_yield) { thread.yield(); // give thread chance run nodelays = 0; } } beforetime = system.nanotime(); /* if rendering taking long, update game state without rendering it, ups nearer required frame rate. */ int skips = 0; while((excess > period) && (skips < max_render_skips)) { // update state don’t render system.out.println("skip renderfps, run updatefps"); excess -= period; updateworld(0); skips++; } rendersskipped += skips; } } catch (exception ex) { ex.printstacktrace(); } { device.setfullscreenwindow(null); } } private void updateworld(long elapsedtime) { // speed: 150 pixels per second //double xmov = (140f/(nano_in_milli*1000)) * elapsedtime; double posx = rect.getx() + (140f / target_fps); if (posx > mainframe.getwidth()) posx = -rect.getwidth(); rect.setrect(posx, rect.gety(), rect.getwidth(), rect.getheight()); posx = rect2.getx() + (190f / target_fps); if (posx > mainframe.getwidth()) posx = -rect2.getwidth(); rect2.setrect(posx, rect2.gety(), rect2.getwidth(), rect2.getheight()); posx = rect3.getx() - (300f / target_fps); if (posx < -rect3.getwidth()) posx = mainframe.getwidth(); rect3.setrect(posx, rect3.gety(), rect3.getwidth(), rect3.getheight()); } private void drawscreen(graphics g) { g.setcolor(color.black); g.fillrect(0, 0, mainframe.getwidth(), mainframe.getheight()); g.setcolor(color.white); g.drawstring("fps: " + fps, 40, 50); g.setcolor(color.red); g.fillrect((int)rect.getx(), (int)rect.gety(), (int)rect.getwidth(), (int)rect.getheight()); g.setcolor(color.green); g.fillrect((int)rect2.getx(), (int)rect2.gety(), (int)rect2.getwidth(), (int)rect2.getheight()); g.setcolor(color.blue); g.fillrect((int)rect3.getx(), (int)rect3.gety(), (int)rect3.getwidth(), (int)rect3.getheight()); } private void calculateframespersecond() { if( currendertime - lastfpstime >= nano_in_milli*1000 ) { fps = framecounter; framecounter = 0; lastfpstime = currendertime; } framecounter++; } public void keypressed(keyevent e) { if( e.getkeycode() == keyevent.vk_escape ) { system.exit(0); } } public void keyreleased(keyevent e) { } public void keytyped(keyevent e) { } public static void main(string[] args) { try { map<string,string> mapargs = parsearguments(args); graphicsenvironment env = graphicsenvironment.getlocalgraphicsenvironment(); graphicsdevice device = env.getdefaultscreendevice(); new gameloop2(mapargs, device); } catch (exception ex) { ex.printstacktrace(); } } /** * parse commandline arguments, each parameter name-value pair. * example: java.exe myapp "key1=value1" "key2=value2" */ private static map<string,string> parsearguments(string[] args) { map<string,string> mapargs = new hashmap<string,string>(); for(int idx=0; idx < args.length; idx++) { string val = args[idx]; int delimidx = val.indexof('='); if (delimidx < 0) { mapargs.put(val, null); } else if (delimidx == 0) { mapargs.put("", val.substring(1)); } else { mapargs.put( val.substring(0, delimidx).trim(), val.substring(delimidx+1) ); } } return mapargs; } }
Comments
Post a Comment