handle input at higher rate than render rate
This commit is contained in:
parent
6857393315
commit
7162f8bc7d
|
@ -85,6 +85,10 @@ public class Demux implements KeyListener, MouseListener {
|
|||
state.update(delta);
|
||||
}
|
||||
|
||||
public void preRenderUpdate(int delta) {
|
||||
state.update(delta);
|
||||
}
|
||||
|
||||
public void render(Graphics g) {
|
||||
state.render(g);
|
||||
}
|
||||
|
|
|
@ -54,6 +54,14 @@ public class DisplayContainer {
|
|||
public int width;
|
||||
public int height;
|
||||
|
||||
public int targetRenderInterval;
|
||||
public int targetBackgroundRenderInterval;
|
||||
|
||||
public int realRenderInterval;
|
||||
public int delta;
|
||||
|
||||
public int timeSinceLastRender;
|
||||
|
||||
private long lastFrame;
|
||||
|
||||
@Inject
|
||||
|
@ -61,6 +69,8 @@ public class DisplayContainer {
|
|||
this.demux = demux;
|
||||
this.nativeDisplayMode = Display.getDisplayMode();
|
||||
this.resolutionChangeListeners = new LinkedList<>();
|
||||
targetRenderInterval = 16; // ~60 fps
|
||||
targetBackgroundRenderInterval = 41; // ~24 fps
|
||||
lastFrame = getTime();
|
||||
}
|
||||
|
||||
|
@ -81,20 +91,40 @@ public class DisplayContainer {
|
|||
setup();
|
||||
log("GL ready");
|
||||
while(!(Display.isCloseRequested() && demux.onCloseRequest())) {
|
||||
// TODO: lower fps when not visible Display.isVisible
|
||||
int delta = getDelta();
|
||||
delta = getDelta();
|
||||
|
||||
timeSinceLastRender += delta;
|
||||
|
||||
input.poll(width, height);
|
||||
GL.glClear(SGL.GL_COLOR_BUFFER_BIT);
|
||||
/*
|
||||
graphics.resetTransform();
|
||||
graphics.resetFont();
|
||||
graphics.resetLineWidth();
|
||||
graphics.resetTransform();
|
||||
*/
|
||||
demux.update(delta);
|
||||
demux.render(graphics);
|
||||
Display.update(true);
|
||||
Display.sync(60);
|
||||
|
||||
int maxRenderInterval;
|
||||
if (Display.isVisible() && Display.isActive()) {
|
||||
maxRenderInterval = targetRenderInterval;
|
||||
} else {
|
||||
maxRenderInterval = targetBackgroundRenderInterval;
|
||||
}
|
||||
|
||||
if (timeSinceLastRender >= maxRenderInterval) {
|
||||
GL.glClear(SGL.GL_COLOR_BUFFER_BIT);
|
||||
|
||||
/*
|
||||
graphics.resetTransform();
|
||||
graphics.resetFont();
|
||||
graphics.resetLineWidth();
|
||||
graphics.resetTransform();
|
||||
*/
|
||||
|
||||
demux.update(timeSinceLastRender);
|
||||
demux.render(graphics);
|
||||
|
||||
realRenderInterval = timeSinceLastRender;
|
||||
timeSinceLastRender = 0;
|
||||
|
||||
Display.update(false);
|
||||
}
|
||||
|
||||
Display.processMessages();
|
||||
Display.sync(1000);
|
||||
}
|
||||
teardown();
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.newdawn.slick.Graphics;
|
|||
public interface OpsuState {
|
||||
|
||||
void update(int delta);
|
||||
void preRenderUpdate(int delta);
|
||||
void render(Graphics g);
|
||||
void enter();
|
||||
void leave();
|
||||
|
|
|
@ -45,6 +45,10 @@ public abstract class TransitionState extends BaseOpsuState {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preRenderUpdate(int delta) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Graphics g) {
|
||||
applicableState.render(g);
|
||||
|
|
|
@ -42,6 +42,10 @@ public class EmptyRedState implements OpsuState {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preRenderUpdate(int delta) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Graphics g) {
|
||||
g.setColor(Color.red);
|
||||
|
@ -69,6 +73,7 @@ public class EmptyRedState implements OpsuState {
|
|||
|
||||
@Override
|
||||
public boolean mouseWheelMoved(int delta) {
|
||||
System.out.println("moved");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,10 @@ public class EmptyState implements OpsuState {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preRenderUpdate(int delta) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Graphics g) {
|
||||
g.setColor(Color.green);
|
||||
|
|
Loading…
Reference in New Issue
Block a user