sync viewport

This commit is contained in:
Hannes Janetzek 2014-11-26 18:39:50 +01:00
parent 6f85e24ed9
commit d492358a94
4 changed files with 46 additions and 60 deletions

View File

@ -174,14 +174,16 @@ public class MapView extends GLSurfaceView {
@Override @Override
public void updateMap(boolean redraw) { public void updateMap(boolean redraw) {
if (mPausing) synchronized (mRedrawCb) {
return; if (mPausing)
return;
if (!mRenderRequest) { if (!mRenderRequest) {
mRenderRequest = true; mRenderRequest = true;
mMapView.post(mRedrawCb); mMapView.post(mRedrawCb);
} else { } else {
mRenderWait = true; mRenderWait = true;
}
} }
} }
@ -190,7 +192,8 @@ public class MapView extends GLSurfaceView {
if (mPausing) if (mPausing)
return; return;
updateMap(true); /** TODO should not need to call prepareFrame in mRedrawCb */
updateMap(false);
} }
@Override @Override
@ -198,15 +201,13 @@ public class MapView extends GLSurfaceView {
} }
@Override @Override
public void doneFrame() { public void doneFrame(boolean animate) {
mRenderRequest = false; synchronized (mRedrawCb) {
mRenderRequest = false;
if (mRenderWait) { if (animate || mRenderWait) {
//log.debug("redraw"); mRenderWait = false;
mRenderWait = false; render();
updateMap(true); }
//prepareFrame();
//mGLView.requestRender();
} }
} }

View File

@ -157,24 +157,25 @@ public abstract class GdxMap implements ApplicationListener {
@Override @Override
public void updateMap(boolean forceRender) { public void updateMap(boolean forceRender) {
synchronized (mRedrawCb) {
if (!mRenderRequest) { if (!mRenderRequest) {
mRenderRequest = true; mRenderRequest = true;
Gdx.app.postRunnable(mRedrawCb); Gdx.app.postRunnable(mRedrawCb);
} else { } else {
mRenderWait = true; mRenderWait = true;
}
} }
} }
@Override @Override
public void render() { public void render() {
//updateMap(true); synchronized (mRedrawCb) {
mRenderRequest = true;
mRenderRequest = true; if (mClearMap)
if (mClearMap) updateMap(false);
updateMap(false); else {
else { Gdx.graphics.requestRendering();
Gdx.graphics.requestRendering(); }
} }
} }
@ -200,16 +201,13 @@ public abstract class GdxMap implements ApplicationListener {
} }
@Override @Override
public void doneFrame() { public void doneFrame(boolean animate) {
mRenderRequest = false; synchronized (mRedrawCb) {
mRenderRequest = false;
if (mRenderWait) { if (animate || mRenderWait) {
mRenderWait = false; mRenderWait = false;
updateMap(true);
mRenderRequest = true; }
prepareFrame();
Gdx.graphics.requestRendering();
} }
} }
} }

View File

@ -340,7 +340,9 @@ public abstract class Map implements TaskQueue {
return mLayers.handleGesture(g, e); return mLayers.handleGesture(g, e);
} }
/** Called on render thread, use synchronized! */
public abstract void beginFrame(); public abstract void beginFrame();
public abstract void doneFrame(); /** Called on render thread, use synchronized! */
public abstract void doneFrame(boolean needsRedraw);
} }

View File

@ -70,33 +70,22 @@ public class MapRenderer {
mClearColor = GLUtils.colorToFloat(color); mClearColor = GLUtils.colorToFloat(color);
} }
private final Runnable renderBegin = new Runnable() {
@Override
public void run() {
mMap.beginFrame();
}
};
private final Runnable renderDone = new Runnable() {
@Override
public void run() {
mMap.doneFrame();
}
};
public void onDrawFrame() { public void onDrawFrame() {
frametime = System.currentTimeMillis(); frametime = System.currentTimeMillis();
rerender = false;
mMap.post(renderBegin); mMap.beginFrame();
draw(); draw();
mMap.post(renderDone); mMap.doneFrame(rerender);
mBufferPool.releaseBuffers(); mBufferPool.releaseBuffers();
TextureItem.disposeTextures(); TextureItem.disposeTextures();
} }
private void draw() { private void draw() {
GLState.setClearColor(mClearColor); GLState.setClearColor(mClearColor);
gl.depthMask(true); gl.depthMask(true);
@ -150,10 +139,6 @@ public class MapRenderer {
BufferObject.checkBufferUsage(true); BufferObject.checkBufferUsage(true);
// FIXME also throw out some textures etc // FIXME also throw out some textures etc
} }
if (rerender) {
mMap.render();
rerender = false;
}
} }
public void onSurfaceChanged(int width, int height) { public void onSurfaceChanged(int width, int height) {