Only track tiles that are actually wanted
Instead of keeping track of wanted tile ranges, we can instead track wanted tiles individually. This provides enough for the map to know how to prioritize tiles and should be more efficient (no extra calls to extend tile ranges or check for tile containment within a range).
This commit is contained in:
@@ -31,7 +31,7 @@ goog.require('ol.layer.LayerState');
|
|||||||
* usedTiles: Object.<string, Object.<string, ol.TileRange>>,
|
* usedTiles: Object.<string, Object.<string, ol.TileRange>>,
|
||||||
* view2DState: ol.View2DState,
|
* view2DState: ol.View2DState,
|
||||||
* viewHints: Array.<number>,
|
* viewHints: Array.<number>,
|
||||||
* wantedTiles: Object.<string, Object.<string, ol.TileRange>>}}
|
* wantedTiles: Object.<string, Object.<string, boolean>>}}
|
||||||
*/
|
*/
|
||||||
ol.FrameState;
|
ol.FrameState;
|
||||||
|
|
||||||
|
|||||||
@@ -500,9 +500,8 @@ ol.Map.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter) {
|
|||||||
if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) {
|
if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) {
|
||||||
return ol.TileQueue.DROP;
|
return ol.TileQueue.DROP;
|
||||||
}
|
}
|
||||||
var zKey = tile.tileCoord.z.toString();
|
var coordKey = tile.tileCoord.toString();
|
||||||
if (!(zKey in frameState.wantedTiles[tileSourceKey]) ||
|
if (!frameState.wantedTiles[tileSourceKey][coordKey]) {
|
||||||
!frameState.wantedTiles[tileSourceKey][zKey].contains(tile.tileCoord)) {
|
|
||||||
return ol.TileQueue.DROP;
|
return ol.TileQueue.DROP;
|
||||||
}
|
}
|
||||||
var center = frameState.view2DState.center;
|
var center = frameState.view2DState.center;
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord);
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
@@ -216,7 +217,6 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
if (!allTilesLoaded) {
|
if (!allTilesLoaded) {
|
||||||
frameState.animate = true;
|
frameState.animate = true;
|
||||||
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord);
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
@@ -234,7 +235,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
if (!allTilesLoaded) {
|
if (!allTilesLoaded) {
|
||||||
frameState.animate = true;
|
frameState.animate = true;
|
||||||
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ goog.require('goog.events');
|
|||||||
goog.require('goog.events.EventType');
|
goog.require('goog.events.EventType');
|
||||||
goog.require('ol.FrameState');
|
goog.require('ol.FrameState');
|
||||||
goog.require('ol.Object');
|
goog.require('ol.Object');
|
||||||
|
goog.require('ol.TileCoord');
|
||||||
goog.require('ol.TileRange');
|
goog.require('ol.TileRange');
|
||||||
goog.require('ol.layer.Layer');
|
goog.require('ol.layer.Layer');
|
||||||
goog.require('ol.layer.LayerProperty');
|
goog.require('ol.layer.LayerProperty');
|
||||||
@@ -197,24 +198,16 @@ ol.renderer.Layer.prototype.updateUsedTiles =
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
* @param {Object.<string, Object.<string, ol.TileRange>>} wantedTiles Wanted
|
* @param {Object.<string, Object.<string, boolean>>} wantedTiles Wanted tiles.
|
||||||
* tile ranges.
|
|
||||||
* @param {ol.source.Source} source Source.
|
* @param {ol.source.Source} source Source.
|
||||||
* @param {number} z Z.
|
* @param {ol.TileCoord} tileCoord Tile coordinate.
|
||||||
* @param {ol.TileRange} tileRange Tile range.
|
|
||||||
*/
|
*/
|
||||||
ol.renderer.Layer.prototype.updateWantedTiles =
|
ol.renderer.Layer.prototype.updateWantedTiles =
|
||||||
function(wantedTiles, source, z, tileRange) {
|
function(wantedTiles, source, tileCoord) {
|
||||||
var sourceKey = goog.getUid(source).toString();
|
var sourceKey = goog.getUid(source).toString();
|
||||||
var zKey = z.toString();
|
var coordKey = tileCoord.toString();
|
||||||
if (sourceKey in wantedTiles) {
|
if (!(sourceKey in wantedTiles)) {
|
||||||
if (zKey in wantedTiles[sourceKey]) {
|
|
||||||
wantedTiles[sourceKey][zKey].extend(tileRange);
|
|
||||||
} else {
|
|
||||||
wantedTiles[sourceKey][zKey] = tileRange;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
wantedTiles[sourceKey] = {};
|
wantedTiles[sourceKey] = {};
|
||||||
wantedTiles[sourceKey][zKey] = tileRange;
|
|
||||||
}
|
}
|
||||||
|
wantedTiles[sourceKey][coordKey] = true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -393,6 +393,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
|||||||
|
|
||||||
tileState = tile.getState();
|
tileState = tile.getState();
|
||||||
if (tileState == ol.TileState.IDLE) {
|
if (tileState == ol.TileState.IDLE) {
|
||||||
|
this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord);
|
||||||
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
tileCenter = tileGrid.getTileCoordCenter(tileCoord);
|
||||||
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter);
|
||||||
} else if (tileState == ol.TileState.LOADED) {
|
} else if (tileState == ol.TileState.LOADED) {
|
||||||
@@ -457,7 +458,6 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
|||||||
this.renderedTileRange_ = null;
|
this.renderedTileRange_ = null;
|
||||||
this.renderedFramebufferExtent_ = null;
|
this.renderedFramebufferExtent_ = null;
|
||||||
frameState.animate = true;
|
frameState.animate = true;
|
||||||
this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user