fix concurrency bug: use a copy of RenderOverlays
This commit is contained in:
parent
0e62d375dd
commit
29c3f42043
@ -17,8 +17,6 @@
|
|||||||
package org.oscim.overlay;
|
package org.oscim.overlay;
|
||||||
|
|
||||||
import java.util.AbstractList;
|
import java.util.AbstractList;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
@ -66,9 +64,9 @@ public class OverlayManager extends AbstractList<Overlay> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean mDirtyOverlays;
|
private boolean mDirtyOverlays;
|
||||||
private final List<RenderOverlay> mDrawLayers = new ArrayList<RenderOverlay>();
|
private RenderOverlay[] mDrawLayers;
|
||||||
|
|
||||||
public List<RenderOverlay> getRenderLayers() {
|
public RenderOverlay[] getRenderLayers() {
|
||||||
if (mDirtyOverlays)
|
if (mDirtyOverlays)
|
||||||
updateOverlays();
|
updateOverlays();
|
||||||
|
|
||||||
@ -91,14 +89,23 @@ public class OverlayManager extends AbstractList<Overlay> {
|
|||||||
|
|
||||||
mOverlays = new Overlay[mOverlayList.size()];
|
mOverlays = new Overlay[mOverlayList.size()];
|
||||||
|
|
||||||
mDrawLayers.clear();
|
int numRenderLayers = 0;
|
||||||
|
|
||||||
for (int i = 0, n = mOverlayList.size(); i < n; i++) {
|
for (int i = 0, n = mOverlayList.size(); i < n; i++) {
|
||||||
|
Overlay o = mOverlayList.get(i);
|
||||||
|
if (o.getLayer() != null)
|
||||||
|
numRenderLayers++;
|
||||||
|
|
||||||
|
mOverlays[n - i - 1] = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
mDrawLayers = new RenderOverlay[numRenderLayers];
|
||||||
|
|
||||||
|
for (int i = 0, cnt = 0, n = mOverlayList.size(); i < n; i++) {
|
||||||
Overlay o = mOverlayList.get(i);
|
Overlay o = mOverlayList.get(i);
|
||||||
RenderOverlay l = o.getLayer();
|
RenderOverlay l = o.getLayer();
|
||||||
if (l != null)
|
if (l != null)
|
||||||
mDrawLayers.add(l);
|
mDrawLayers[cnt++] = l;
|
||||||
|
|
||||||
mOverlays[n - i - 1] = o;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mDirtyOverlays = false;
|
mDirtyOverlays = false;
|
||||||
|
|||||||
@ -24,7 +24,6 @@ import static org.oscim.generator.JobTile.STATE_READY;
|
|||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.nio.ShortBuffer;
|
import java.nio.ShortBuffer;
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
import javax.microedition.khronos.egl.EGLConfig;
|
import javax.microedition.khronos.egl.EGLConfig;
|
||||||
@ -483,17 +482,17 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
tilesChanged |= (uploadCnt > 0);
|
tilesChanged |= (uploadCnt > 0);
|
||||||
|
|
||||||
/* update overlays */
|
/* update overlays */
|
||||||
List<RenderOverlay> overlays = mMapView.getOverlayManager().getRenderLayers();
|
RenderOverlay[] overlays = mMapView.getOverlayManager().getRenderLayers();
|
||||||
|
|
||||||
for (int i = 0, n = overlays.size(); i < n; i++)
|
for (int i = 0, n = overlays.length; i < n; i++)
|
||||||
overlays.get(i).update(mMapPosition, positionChanged, tilesChanged, mMatrices);
|
overlays[i].update(mMapPosition, positionChanged, tilesChanged, mMatrices);
|
||||||
|
|
||||||
/* draw base layer */
|
/* draw base layer */
|
||||||
TileRenderer.draw(tiles, tileCnt, pos, mMatrices);
|
TileRenderer.draw(tiles, tileCnt, pos, mMatrices);
|
||||||
|
|
||||||
/* draw overlays */
|
/* draw overlays */
|
||||||
for (int i = 0, n = overlays.size(); i < n; i++) {
|
for (int i = 0, n = overlays.length; i < n; i++) {
|
||||||
RenderOverlay renderOverlay = overlays.get(i);
|
RenderOverlay renderOverlay = overlays[i];
|
||||||
|
|
||||||
if (renderOverlay.newData) {
|
if (renderOverlay.newData) {
|
||||||
renderOverlay.compile();
|
renderOverlay.compile();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user