improve tile distance function

This commit is contained in:
Hannes Janetzek 2013-02-07 10:39:10 +01:00
parent c53805aded
commit 43a116708d

View File

@ -402,44 +402,39 @@ public class TileManager {
} }
private static void updateTileDistances(Object[] tiles, int size, MapPosition mapPosition) { private static void updateTileDistances(Object[] tiles, int size, MapPosition mapPosition) {
int h = (Tile.TILE_SIZE >> 1); // TODO there is probably a better quad-tree distance function
double x = mapPosition.x;
double y = mapPosition.y;
byte zoom = mapPosition.zoomLevel; byte zoom = mapPosition.zoomLevel;
long x = (long) mapPosition.x; int h = (Tile.TILE_SIZE >> 1);
long y = (long) mapPosition.y; long center = h << zoom;
long center = Tile.TILE_SIZE << (zoom - 1);
int diff;
long dx, dy;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
JobTile t = (JobTile) tiles[i]; JobTile t = (JobTile) tiles[i];
if (t == null) if (t == null)
continue; continue;
diff = (t.zoomLevel - zoom); int diff = (t.zoomLevel - zoom);
float scale; double dx, dy, dz;
if (diff == 0) { if (diff == 0) {
dx = (t.pixelX + h) - x; dx = (t.pixelX + h) - x;
dy = (t.pixelY + h) - y; dy = (t.pixelY + h) - y;
scale = 0.5f; dz = 1;
} else if (diff > 0) { } else if (diff > 0) {
// tile zoom level is child of current // tile zoom level is greater than current
if (diff < 3) { dx = (t.pixelX + h) - x * (1 << diff);
dx = ((t.pixelX + h) >> diff) - x; dy = (t.pixelY + h) - y * (1 << diff);
dy = ((t.pixelY + h) >> diff) - y; dz = 0.5f * (1 << diff);
} else {
dx = ((t.pixelX + h) >> (diff >> 1)) - x;
dy = ((t.pixelY + h) >> (diff >> 1)) - y;
}
scale = 1;
} else { } else {
// tile zoom level is parent of current // tile zoom level is smaller than current
dx = ((t.pixelX + h) << -diff) - x; dx = (t.pixelX + h) - x / (1 << -diff);
dy = ((t.pixelY + h) << -diff) - y; dy = (t.pixelY + h) - y / (1 << -diff);
scale = -diff * 0.7f; dz = (1 << (1 - diff));
} }
dx %= center; dx %= center;
dy %= center; dy %= center;
t.distance = (dx * dx + dy * dy) * scale; t.distance = (float) ((dx * dx + dy * dy) * dz);
} }
} }
@ -478,13 +473,17 @@ public class TileManager {
// so end of mTiles is at mTilesCount now // so end of mTiles is at mTilesCount now
size = mTilesSize = mTilesCount; size = mTilesSize = mTilesCount;
//boolean locked = false;
//int r = remove;
for (int i = size - 1; i >= 0 && remove > 0; i--) { for (int i = size - 1; i >= 0 && remove > 0; i--) {
MapTile t = tiles[i]; MapTile t = tiles[i];
if (t.isLocked()) { if (t.isLocked()) {
// dont remove tile used by GLRenderer, or somewhere else // dont remove tile used by GLRenderer, or somewhere else
Log.d(TAG, "limitCache: tile still locked " + t + " " + t.distance); Log.d(TAG, "limitCache: tile still locked " + t + " " + t.distance);
// try again in next run. // try again in next run.
break; //locked = true;
//break;
} else if (t.state == STATE_LOADING) { } else if (t.state == STATE_LOADING) {
// NOTE: when set loading to false the tile could be // NOTE: when set loading to false the tile could be
// added to load queue again while still processed in // added to load queue again while still processed in
@ -500,7 +499,16 @@ public class TileManager {
tiles[i] = null; tiles[i] = null;
} }
} }
//if (locked) {
// Log.d(TAG, "------------ " + remove + " / " + r + " ----------");
// for (int i = 0; i < size; i++) {
// MapTile t = tiles[i];
// if (t == null)
// continue;
// Log.d(TAG, "limitCache: " + t + " " + t.distance);
//
// }
//}
remove = (newTileCnt - MAX_TILES_IN_QUEUE) + 10; remove = (newTileCnt - MAX_TILES_IN_QUEUE) + 10;
//int r = remove; //int r = remove;
for (int i = size - 1; i >= 0 && remove > 0; i--) { for (int i = size - 1; i >= 0 && remove > 0; i--) {