Discard unwanted tiles from tile queue
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
// FIXME add view3DState
|
// FIXME add view3DState
|
||||||
|
// FIXME rename tileUsage to usedTiles
|
||||||
|
// FIXME factor out common code between tileUsage and wantedTiles
|
||||||
|
|
||||||
goog.provide('ol.FrameState');
|
goog.provide('ol.FrameState');
|
||||||
goog.provide('ol.PostRenderFunction');
|
goog.provide('ol.PostRenderFunction');
|
||||||
@@ -29,7 +31,8 @@ goog.require('ol.layer.LayerState');
|
|||||||
* tileUsage: Object.<string, Object.<string, ol.TileRange>>,
|
* tileUsage: Object.<string, Object.<string, ol.TileRange>>,
|
||||||
* time: number,
|
* time: number,
|
||||||
* view2DState: ol.View2DState,
|
* view2DState: ol.View2DState,
|
||||||
* viewHints: Array.<number>}}
|
* viewHints: Array.<number>,
|
||||||
|
* wantedTiles: Object.<string, Object.<string, ol.TileRange>>}}
|
||||||
*/
|
*/
|
||||||
ol.FrameState;
|
ol.FrameState;
|
||||||
|
|
||||||
|
|||||||
+15
-9
@@ -453,19 +453,24 @@ ol.Map.prototype.getOverlayContainer = function() {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ol.Tile} tile Tile.
|
* @param {ol.Tile} tile Tile.
|
||||||
|
* @param {string} tileSourceKey Tile source key.
|
||||||
* @param {ol.Coordinate} tileCenter Tile center.
|
* @param {ol.Coordinate} tileCenter Tile center.
|
||||||
* @param {number} tileResolution Tile resolution.
|
|
||||||
* @return {number|undefined} Tile priority.
|
* @return {number|undefined} Tile priority.
|
||||||
*/
|
*/
|
||||||
ol.Map.prototype.getTilePriority = function(tile, tileCenter, tileResolution) {
|
ol.Map.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter) {
|
||||||
if (goog.isNull(this.frameState_)) {
|
var frameState = this.frameState_;
|
||||||
|
if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) {
|
||||||
return undefined;
|
return undefined;
|
||||||
} else {
|
|
||||||
var center = this.frameState_.view2DState.center;
|
|
||||||
var deltaX = tileCenter.x - center.x;
|
|
||||||
var deltaY = tileCenter.y - center.y;
|
|
||||||
return Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;
|
|
||||||
}
|
}
|
||||||
|
var zKey = tile.tileCoord.z.toString();
|
||||||
|
if (!(zKey in frameState.wantedTiles[tileSourceKey]) ||
|
||||||
|
!frameState.wantedTiles[tileSourceKey][zKey].contains(tile.tileCoord)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
var center = frameState.view2DState.center;
|
||||||
|
var deltaX = tileCenter.x - center.x;
|
||||||
|
var deltaY = tileCenter.y - center.y;
|
||||||
|
return deltaX * deltaX + deltaY * deltaY;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -630,7 +635,8 @@ ol.Map.prototype.renderFrame_ = function(time) {
|
|||||||
tileUsage: {},
|
tileUsage: {},
|
||||||
time: time,
|
time: time,
|
||||||
view2DState: view2DState,
|
view2DState: view2DState,
|
||||||
viewHints: viewHints
|
viewHints: viewHints,
|
||||||
|
wantedTiles: {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
var tileLayer = this.getTileLayer();
|
var tileLayer = this.getTileLayer();
|
||||||
var tileSource = tileLayer.getTileSource();
|
var tileSource = tileLayer.getTileSource();
|
||||||
|
var tileSourceKey = goog.getUid(tileSource).toString();
|
||||||
var tileGrid = tileSource.getTileGrid();
|
var tileGrid = tileSource.getTileGrid();
|
||||||
var tileSize = tileGrid.getTileSize();
|
var tileSize = tileGrid.getTileSize();
|
||||||
var z = tileGrid.getZForResolution(view2DState.resolution);
|
var z = tileGrid.getZForResolution(view2DState.resolution);
|
||||||
@@ -165,7 +166,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
|
|||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileCenter, tileResolution);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
||||||
continue;
|
continue;
|
||||||
@@ -216,6 +217,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
||||||
|
|
||||||
var transform = this.transform_;
|
var transform = this.transform_;
|
||||||
goog.vec.Mat4.makeIdentity(transform);
|
goog.vec.Mat4.makeIdentity(transform);
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
var tileLayer = this.getTileLayer();
|
var tileLayer = this.getTileLayer();
|
||||||
var tileSource = tileLayer.getTileSource();
|
var tileSource = tileLayer.getTileSource();
|
||||||
|
var tileSourceKey = goog.getUid(tileSource).toString();
|
||||||
var tileGrid = tileSource.getTileGrid();
|
var tileGrid = tileSource.getTileGrid();
|
||||||
var z = tileGrid.getZForResolution(view2DState.resolution);
|
var z = tileGrid.getZForResolution(view2DState.resolution);
|
||||||
var tileResolution = tileGrid.getResolution(z);
|
var tileResolution = tileGrid.getResolution(z);
|
||||||
@@ -132,7 +133,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
|||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileCenter, tileResolution);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
||||||
continue;
|
continue;
|
||||||
@@ -237,6 +238,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -151,3 +151,28 @@ ol.renderer.Layer.prototype.updateTileUsage =
|
|||||||
tileUsage[sourceKey][zKey] = tileRange;
|
tileUsage[sourceKey][zKey] = tileRange;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @protected
|
||||||
|
* @param {Object.<string, Object.<string, ol.TileRange>>} wantedTiles Wanted
|
||||||
|
* tile ranges.
|
||||||
|
* @param {ol.source.Source} source Source.
|
||||||
|
* @param {number} z Z.
|
||||||
|
* @param {ol.TileRange} tileRange Tile range.
|
||||||
|
*/
|
||||||
|
ol.renderer.Layer.prototype.updateWantedTiles =
|
||||||
|
function(wantedTiles, source, z, tileRange) {
|
||||||
|
var sourceKey = goog.getUid(source).toString();
|
||||||
|
var zKey = z.toString();
|
||||||
|
if (sourceKey in wantedTiles) {
|
||||||
|
if (zKey in wantedTiles[sourceKey]) {
|
||||||
|
wantedTiles[sourceKey][zKey].extend(tileRange);
|
||||||
|
} else {
|
||||||
|
wantedTiles[sourceKey][zKey] = tileRange;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
wantedTiles[sourceKey] = {};
|
||||||
|
wantedTiles[sourceKey][zKey] = tileRange;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -270,6 +270,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
var tileLayer = this.getTileLayer();
|
var tileLayer = this.getTileLayer();
|
||||||
var tileSource = tileLayer.getTileSource();
|
var tileSource = tileLayer.getTileSource();
|
||||||
|
var tileSourceKey = goog.getUid(tileSource).toString();
|
||||||
var tileGrid = tileSource.getTileGrid();
|
var tileGrid = tileSource.getTileGrid();
|
||||||
var z = tileGrid.getZForResolution(view2DState.resolution);
|
var z = tileGrid.getZForResolution(view2DState.resolution);
|
||||||
var tileResolution = tileGrid.getResolution(z);
|
var tileResolution = tileGrid.getResolution(z);
|
||||||
@@ -392,7 +393,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
|||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileCenter, tileResolution);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
if (mapRenderer.isTileTextureLoaded(tile)) {
|
if (mapRenderer.isTileTextureLoaded(tile)) {
|
||||||
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
tilesToDrawByZ[z][tileCoord.toString()] = tile;
|
||||||
@@ -460,6 +461,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
this.updateTileUsage(frameState.tileUsage, tileSource, z, tileRange);
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
||||||
|
|
||||||
goog.vec.Mat4.makeIdentity(this.matrix_);
|
goog.vec.Mat4.makeIdentity(this.matrix_);
|
||||||
goog.vec.Mat4.translate(this.matrix_,
|
goog.vec.Mat4.translate(this.matrix_,
|
||||||
|
|||||||
+9
-9
@@ -21,7 +21,7 @@ goog.require('ol.TileState');
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {function(ol.Tile, ol.Coordinate, number): (number|undefined)}
|
* @typedef {function(ol.Tile, string, ol.Coordinate): (number|undefined)}
|
||||||
*/
|
*/
|
||||||
ol.TilePriorityFunction;
|
ol.TilePriorityFunction;
|
||||||
|
|
||||||
@@ -102,18 +102,18 @@ ol.TileQueue.prototype.dequeue_ = function() {
|
|||||||
/**
|
/**
|
||||||
* Enqueue a tile. O(logn).
|
* Enqueue a tile. O(logn).
|
||||||
* @param {ol.Tile} tile Tile.
|
* @param {ol.Tile} tile Tile.
|
||||||
|
* @param {string} tileSourceKey Tile source key.
|
||||||
* @param {ol.Coordinate} tileCenter Tile center.
|
* @param {ol.Coordinate} tileCenter Tile center.
|
||||||
* @param {number} tileResolution Tile resolution.
|
|
||||||
*/
|
*/
|
||||||
ol.TileQueue.prototype.enqueue = function(tile, tileCenter, tileResolution) {
|
ol.TileQueue.prototype.enqueue = function(tile, tileSourceKey, tileCenter) {
|
||||||
if (tile.getState() != ol.TileState.IDLE) {
|
if (tile.getState() != ol.TileState.IDLE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var tileKey = tile.getKey();
|
var tileKey = tile.getKey();
|
||||||
if (!(tileKey in this.queuedTileKeys_)) {
|
if (!(tileKey in this.queuedTileKeys_)) {
|
||||||
var priority = this.tilePriorityFunction_(tile, tileCenter, tileResolution);
|
var priority = this.tilePriorityFunction_(tile, tileSourceKey, tileCenter);
|
||||||
if (goog.isDef(priority)) {
|
if (goog.isDef(priority)) {
|
||||||
this.heap_.push([priority, tile, tileCenter, tileResolution]);
|
this.heap_.push([priority, tile, tileSourceKey, tileCenter]);
|
||||||
this.queuedTileKeys_[tileKey] = true;
|
this.queuedTileKeys_[tileKey] = true;
|
||||||
this.siftDown_(0, this.heap_.length - 1);
|
this.siftDown_(0, this.heap_.length - 1);
|
||||||
} else {
|
} else {
|
||||||
@@ -245,13 +245,13 @@ ol.TileQueue.prototype.siftDown_ = function(startIndex, index) {
|
|||||||
ol.TileQueue.prototype.reprioritize = function() {
|
ol.TileQueue.prototype.reprioritize = function() {
|
||||||
var heap = this.heap_;
|
var heap = this.heap_;
|
||||||
var count = heap.length;
|
var count = heap.length;
|
||||||
var i, priority, node, tile, tileCenter, tileResolution;
|
var i, priority, node, tile, tileCenter, tileSourceKey;
|
||||||
for (i = count - 1; i >= 0; i--) {
|
for (i = count - 1; i >= 0; i--) {
|
||||||
node = heap[i];
|
node = heap[i];
|
||||||
tile = /** @type {ol.Tile} */ (node[1]);
|
tile = /** @type {ol.Tile} */ (node[1]);
|
||||||
tileCenter = /** @type {ol.Coordinate} */ (node[2]);
|
tileSourceKey = /** @type {string} */ (node[2]);
|
||||||
tileResolution = /** @type {number} */ (node[3]);
|
tileCenter = /** @type {ol.Coordinate} */ (node[3]);
|
||||||
priority = this.tilePriorityFunction_(tile, tileCenter, tileResolution);
|
priority = this.tilePriorityFunction_(tile, tileSourceKey, tileCenter);
|
||||||
if (goog.isDef(priority)) {
|
if (goog.isDef(priority)) {
|
||||||
node[0] = priority;
|
node[0] = priority;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ describe('ol.TileQueue', function() {
|
|||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
tile = new ol.Tile();
|
tile = new ol.Tile();
|
||||||
priority = Math.floor(Math.random() * 100);
|
priority = Math.floor(Math.random() * 100);
|
||||||
tq.heap_.push([priority, tile, new ol.Coordinate(0, 0), 1]);
|
tq.heap_.push([priority, tile, '', new ol.Coordinate(0, 0)]);
|
||||||
tq.queuedTileKeys_[tile.getKey()] = true;
|
tq.queuedTileKeys_[tile.getKey()] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user