diff --git a/src/org/oscim/layers/tile/TileLayer.java b/src/org/oscim/layers/tile/TileLayer.java index bca849c4..76b190a2 100644 --- a/src/org/oscim/layers/tile/TileLayer.java +++ b/src/org/oscim/layers/tile/TileLayer.java @@ -28,8 +28,6 @@ public abstract class TileLayer extends Layer { protected final TileManager mTileManager; - protected final JobQueue mJobQueue; - protected final int mNumTileLoader = 4; protected final ArrayList mTileLoader; @@ -44,12 +42,10 @@ public abstract class TileLayer extends Layer { // to load queue and managing in-memory tile cache. mTileManager = new TileManager(mapView, this, maxZoom); - mJobQueue = new JobQueue(); - // Instantiate TileLoader threads mTileLoader = new ArrayList(); for (int i = 0; i < mNumTileLoader; i++) { - T tileGenerator = createLoader(mJobQueue, mTileManager); + T tileGenerator = createLoader(mTileManager); mTileLoader.add(tileGenerator); tileGenerator.start(); } @@ -59,7 +55,7 @@ public abstract class TileLayer extends Layer { mLayer = new TileRenderLayer(mapView, mTileManager); } - abstract protected T createLoader(JobQueue q, TileManager tm); + abstract protected T createLoader(TileManager tm); public TileRenderLayer getTileLayer() { return (TileRenderLayer) mLayer; @@ -83,10 +79,9 @@ public abstract class TileLayer extends Layer { mTileManager.destroy(); for (T tileWorker : mTileLoader) { + tileWorker.pause(); tileWorker.interrupt(); - - //tileWorker.getMapDatabase().close(); tileWorker.cleanup(); try { @@ -103,20 +98,7 @@ public abstract class TileLayer extends Layer { mClearMap = true; } - - /** - * add jobs and remember TileGenerators that stuff needs to be done - * - * @param jobs - * tile jobs - */ - public void setJobs(MapTile[] jobs) { - if (jobs == null) { - mJobQueue.clear(); - return; - } - mJobQueue.setJobs(jobs); - + void notifyLoaders() { for (int i = 0; i < mNumTileLoader; i++) { T m = mTileLoader.get(i); synchronized (m) { diff --git a/src/org/oscim/layers/tile/TileLoader.java b/src/org/oscim/layers/tile/TileLoader.java index dc18016f..1f9cf615 100644 --- a/src/org/oscim/layers/tile/TileLoader.java +++ b/src/org/oscim/layers/tile/TileLoader.java @@ -19,14 +19,11 @@ import org.oscim.utils.PausableThread; public abstract class TileLoader extends PausableThread { private static int id; - private final String THREAD_NAME; - private final JobQueue mJobQueue; private final TileManager mTileManager; - public TileLoader(JobQueue jobQueue, TileManager tileManager) { + public TileLoader(TileManager tileManager) { super(); - mJobQueue = jobQueue; mTileManager = tileManager; THREAD_NAME = "TileLoader" + (id++); } @@ -38,7 +35,7 @@ public abstract class TileLoader extends PausableThread { @Override protected void doWork() { - MapTile tile = mJobQueue.poll(); + MapTile tile = mTileManager.jobQueue.poll(); if (tile == null) return; @@ -69,6 +66,6 @@ public abstract class TileLoader extends PausableThread { @Override protected boolean hasWork() { - return !mJobQueue.isEmpty(); + return !mTileManager.jobQueue.isEmpty(); } } diff --git a/src/org/oscim/layers/tile/TileManager.java b/src/org/oscim/layers/tile/TileManager.java index 9d0cbe29..d135b5e0 100644 --- a/src/org/oscim/layers/tile/TileManager.java +++ b/src/org/oscim/layers/tile/TileManager.java @@ -86,6 +86,8 @@ public class TileManager { private TileSet mCurrentTiles; /* package */TileSet mNewTiles; + final JobQueue jobQueue; + private final QuadTreeIndex mIndex = new QuadTreeIndex() { @Override @@ -111,7 +113,7 @@ public class TileManager { } }; - private final float[] mBoxCoords = new float[8]; + private final float[] mMapPlane = new float[8]; private final TileLayer mTileLayer; public TileManager(MapView mapView, TileLayer tileLayer, int maxZoom) { @@ -119,6 +121,8 @@ public class TileManager { mTileLayer = tileLayer; mMaxZoom = maxZoom; mMapViewPosition = mapView.getMapViewPosition(); + + jobQueue = new JobQueue(); mJobs = new ArrayList(); mTiles = new MapTile[CACHE_TILES_MAX]; @@ -126,7 +130,6 @@ public class TileManager { mTilesForUpload = 0; mUpdateSerial = 0; - mInitialized = false; } @@ -194,29 +197,33 @@ public class TileManager { // start with old jobs while new jobs are calculated, which // should increase the chance that they are free when new // jobs come in. - mTileLayer.setJobs(null); + jobQueue.clear(); // load some tiles more than currently visible (* 0.75) double scale = pos.scale * 0.9f; int tileZoom = FastMath.clamp(pos.zoomLevel, MIN_ZOOMLEVEL, mMaxZoom); - mMapViewPosition.getMapViewProjection(mBoxCoords); + mMapViewPosition.getMapViewProjection(mMapPlane); // scan visible tiles. callback function calls 'addTile' // which updates mNewTiles mNewTiles.cnt = 0; - mScanBox.scan(pos.x, pos.y, scale, tileZoom, mBoxCoords); + mScanBox.scan(pos.x, pos.y, scale, tileZoom, mMapPlane); MapTile[] newTiles = mNewTiles.tiles; + int newCnt = mNewTiles.cnt; + MapTile[] curTiles = mCurrentTiles.tiles; + int curCnt = mCurrentTiles.cnt; - boolean changed = (mNewTiles.cnt != mCurrentTiles.cnt); + boolean changed = (newCnt != curCnt); - Arrays.sort(mNewTiles.tiles, 0, mNewTiles.cnt, TileSet.coordComparator); + Arrays.sort(newTiles, 0, newCnt, TileSet.coordComparator); if (!changed) { - for (int i = 0, n = mNewTiles.cnt; i < n; i++) { + // compare if any tile has changed + for (int i = 0; i < newCnt; i++) { if (newTiles[i] != curTiles[i]) { changed = true; break; @@ -227,11 +234,11 @@ public class TileManager { if (changed) { synchronized (mTilelock) { // lock new tiles - for (int i = 0, n = mNewTiles.cnt; i < n; i++) + for (int i = 0; i < newCnt; i++) newTiles[i].lock(); // unlock previous tiles - for (int i = 0, n = mCurrentTiles.cnt; i < n; i++) { + for (int i = 0; i < curCnt; i++) { curTiles[i].unlock(); curTiles[i] = null; } @@ -257,7 +264,9 @@ public class TileManager { updateTileDistances(jobs, jobs.length, pos); // sets tiles to state == LOADING - mTileLayer.setJobs(jobs); + + jobQueue.setJobs(jobs); + mTileLayer.notifyLoaders(); mJobs.clear(); /* limit cache items */ @@ -269,6 +278,11 @@ public class TileManager { limitCache(pos, remove); } + /** only used in setmapDatabase -- deprecate?*/ + public void clearJobs() { + jobQueue.clear(); + } + /** * Retrive a TileSet of current tiles. * Tiles remain locked in cache until the set is unlocked by either passing @@ -409,12 +423,12 @@ public class TileManager { mTilesCount--; } - private static void updateTileDistances(MapTile[] tiles, int size, MapPosition mapPosition) { + private static void updateTileDistances(MapTile[] tiles, int size, MapPosition pos) { // TODO there is probably a better quad-tree distance function int zoom = 20; - long x = (long) (mapPosition.x * (1 << zoom)); - long y = (long) (mapPosition.y * (1 << zoom)); + long x = (long) (pos.x * (1 << zoom)); + long y = (long) (pos.y * (1 << zoom)); for (int i = 0; i < size; i++) { MapTile t = tiles[i]; @@ -435,7 +449,7 @@ public class TileManager { dy = t.tileY - my; } - int dz = (mapPosition.zoomLevel - t.zoomLevel); + int dz = (pos.zoomLevel - t.zoomLevel); if (dz == 0) dz = 1; else if (dz < -1) @@ -445,7 +459,7 @@ public class TileManager { } } - private void limitCache(MapPosition mapPosition, int remove) { + private void limitCache(MapPosition pos, int remove) { MapTile[] tiles = mTiles; int size = mTilesSize; @@ -472,7 +486,7 @@ public class TileManager { } if (remove > 10 || newTileCnt > MAX_TILES_IN_QUEUE) { - updateTileDistances(tiles, size, mapPosition); + updateTileDistances(tiles, size, pos); TileDistanceSort.sort(tiles, 0, size); @@ -502,7 +516,7 @@ public class TileManager { } else { // clear unused tile - if (t.state == STATE_NEW_DATA){ + if (t.state == STATE_NEW_DATA) { //Log.d(TAG, "limitCache: clear unused " + t // + " " + t.distance); newTileCnt--; diff --git a/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java index 7d026570..70c87330 100644 --- a/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java @@ -21,7 +21,6 @@ import java.net.URLConnection; import java.util.zip.GZIPInputStream; import org.oscim.core.Tile; -import org.oscim.layers.tile.JobQueue; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLoader; @@ -45,8 +44,8 @@ public class BitmapTileLayer extends TileLayer { } @Override - protected TileLoader createLoader(JobQueue q, TileManager tm) { - return new TileLoader(q, tm) { + protected TileLoader createLoader(TileManager tm) { + return new TileLoader(tm) { @Override protected boolean executeJob(MapTile tile) { diff --git a/src/org/oscim/layers/tile/test/TestTileLayer.java b/src/org/oscim/layers/tile/test/TestTileLayer.java index ca90cc1d..a6bf56a8 100644 --- a/src/org/oscim/layers/tile/test/TestTileLayer.java +++ b/src/org/oscim/layers/tile/test/TestTileLayer.java @@ -18,7 +18,6 @@ import org.oscim.core.GeometryBuffer; import org.oscim.core.Tile; import org.oscim.graphics.Color; import org.oscim.graphics.Paint.Cap; -import org.oscim.layers.tile.JobQueue; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLoader; @@ -39,13 +38,13 @@ public class TestTileLayer extends TileLayer { } @Override - protected TestTileLoader createLoader(JobQueue q, TileManager tm) { - return new TestTileLoader(q, tm); + protected TestTileLoader createLoader(TileManager tm) { + return new TestTileLoader(tm); } static class TestTileLoader extends TileLoader { - public TestTileLoader(JobQueue jobQueue, TileManager tileManager) { - super(jobQueue, tileManager); + public TestTileLoader(TileManager tileManager) { + super(tileManager); } GeometryBuffer mGeom = new GeometryBuffer(128, 16); diff --git a/src/org/oscim/layers/tile/vector/MapTileLayer.java b/src/org/oscim/layers/tile/vector/MapTileLayer.java index 1abb2e71..a1f2339a 100644 --- a/src/org/oscim/layers/tile/vector/MapTileLayer.java +++ b/src/org/oscim/layers/tile/vector/MapTileLayer.java @@ -29,7 +29,6 @@ import org.oscim.database.MapDatabaseFactory; import org.oscim.database.MapDatabases; import org.oscim.database.MapInfo; import org.oscim.database.MapOptions; -import org.oscim.layers.tile.JobQueue; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileManager; import org.oscim.renderer.GLRenderer; @@ -51,8 +50,8 @@ public class MapTileLayer extends TileLayer { } @Override - protected MapTileLoader createLoader(JobQueue q, TileManager tm) { - return new MapTileLoader(q, tm); + protected MapTileLoader createLoader(TileManager tm) { + return new MapTileLoader(tm); } private MapOptions mMapOptions; @@ -74,7 +73,9 @@ public class MapTileLayer extends TileLayer { pauseLoaders(true); - mJobQueue.clear(); + //mJobQueue.clear(); + mTileManager.clearJobs(); + mMapOptions = options; mMapDatabase = null; diff --git a/src/org/oscim/layers/tile/vector/MapTileLoader.java b/src/org/oscim/layers/tile/vector/MapTileLoader.java index 125fe2ba..a4145313 100644 --- a/src/org/oscim/layers/tile/vector/MapTileLoader.java +++ b/src/org/oscim/layers/tile/vector/MapTileLoader.java @@ -26,7 +26,6 @@ import org.oscim.core.Tile; import org.oscim.database.IMapDatabase; import org.oscim.database.IMapDatabase.QueryResult; import org.oscim.database.IMapDatabaseCallback; -import org.oscim.layers.tile.JobQueue; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; @@ -119,8 +118,8 @@ public class MapTileLoader extends TileLoader implements IRenderCallback, IMapDa /** */ - public MapTileLoader(JobQueue jobQueue, TileManager tileManager) { - super(jobQueue, tileManager); + public MapTileLoader(TileManager tileManager) { + super(tileManager); mClipper = new LineClipper(0, 0, Tile.SIZE, Tile.SIZE, true);