public void run() { try { uglyjoglhack(); if (state == null) throw (new RuntimeException("State applier is still null after redraw")); synchronized (drawfun) { drawfun.notifyAll(); } while (true) { long then = System.currentTimeMillis(); int waited = 0; synchronized (drawfun) { while ((curdraw = bufdraw) == null) drawfun.wait(); bufdraw = null; drawfun.notifyAll(); waited += System.currentTimeMillis() - then; } CPUProfile.Frame curf = null; if (Config.profile) curdraw.pf = curf = rprof.new Frame(); uglyjoglhack(); if (curf != null) { curf.tick("aux"); curf.fin(); } long now = System.currentTimeMillis(); waited += now - curdraw.doneat; ridle = (ridle * 0.95) + (((double) waited / ((double) (now - then))) * 0.05); curdraw = null; } } catch (InterruptedException e) { return; } }
void dispatch() { synchronized (events) { if (mousemv != null) { mousepos = new Coord(mousemv.getX(), mousemv.getY()); ui.mousemove(mousemv, mousepos); mousemv = null; } InputEvent e = null; while ((e = events.poll()) != null) { if (e instanceof MouseEvent) { MouseEvent me = (MouseEvent) e; if (me.getID() == MouseEvent.MOUSE_PRESSED) { ui.mousedown(me, new Coord(me.getX(), me.getY()), me.getButton()); } else if (me.getID() == MouseEvent.MOUSE_RELEASED) { ui.mouseup(me, new Coord(me.getX(), me.getY()), me.getButton()); } else if (me instanceof MouseWheelEvent) { ui.mousewheel( me, new Coord(me.getX(), me.getY()), ((MouseWheelEvent) me).getWheelRotation()); } } else if (e instanceof KeyEvent) { KeyEvent ke = (KeyEvent) e; if (ke.getID() == KeyEvent.KEY_PRESSED) { ui.keydown(ke); } else if (ke.getID() == KeyEvent.KEY_RELEASED) { ui.keyup(ke); } else if (ke.getID() == KeyEvent.KEY_TYPED) { ui.type(ke); } } ui.lastevent = System.currentTimeMillis(); } } }
void redraw(GL2 gl) { if ((state == null) || (state.cgl.gl != gl)) state = new GLState.Applier(new CurrentGL(gl, glconf)); Frame f = curdraw; if ((f != null) && (f.on.gl == gl)) { GPUProfile.Frame curgf = null; if (Config.profilegpu) curgf = gprof.new Frame((GL3) gl); if (f.pf != null) f.pf.tick("awt"); f.buf.run(gl); GOut.checkerr(gl); if (f.pf != null) f.pf.tick("gl"); if (curgf != null) { curgf.tick("draw"); curgf.fin(); } if (glconf.pref.dirty) { glconf.pref.save(); glconf.pref.dirty = false; } f.doneat = System.currentTimeMillis(); } }
public void run() { try { Thread drawthread = new HackThread(drawfun, "Render thread"); drawthread.start(); synchronized (drawfun) { while (state == null) drawfun.wait(); } try { long now, then; long frames[] = new long[128]; int framep = 0, waited[] = new int[128]; while (true) { int fwaited = 0; Debug.cycle(); UI ui = this.ui; then = System.currentTimeMillis(); CPUProfile.Frame curf = null; if (Config.profile) curf = uprof.new Frame(); synchronized (ui) { if (ui.sess != null) ui.sess.glob.ctick(); dispatch(); ui.tick(); if ((ui.root.sz.x != w) || (ui.root.sz.y != h)) ui.root.resize(new Coord(w, h)); } if (curf != null) curf.tick("dsp"); BGL buf = new BGL(); GLState.Applier state = this.state; rootdraw(state, ui, buf); if (curf != null) curf.tick("draw"); synchronized (drawfun) { now = System.currentTimeMillis(); while (bufdraw != null) drawfun.wait(); bufdraw = new Frame(buf, state.cgl); drawfun.notifyAll(); fwaited += System.currentTimeMillis() - now; } ui.audio.cycle(); if (curf != null) curf.tick("aux"); now = System.currentTimeMillis(); long fd = bgmode ? this.bgfd : this.fd; if (now - then < fd) { synchronized (events) { events.wait(fd - (now - then)); } fwaited += System.currentTimeMillis() - now; } frames[framep] = now; waited[framep] = fwaited; for (int i = 0, ckf = framep, twait = 0; i < frames.length; i++) { ckf = (ckf - 1 + frames.length) % frames.length; twait += waited[ckf]; if (now - frames[ckf] > 1000) { fps = i; uidle = ((double) twait) / ((double) (now - frames[ckf])); break; } } framep = (framep + 1) % frames.length; if (curf != null) curf.tick("wait"); if (curf != null) curf.fin(); if (Thread.interrupted()) throw (new InterruptedException()); } } finally { drawthread.interrupt(); drawthread.join(); } } catch (InterruptedException e) { } finally { ui.destroy(); } }