Do not render tiles during animation and interaction

This commit is contained in:
ahocevar
2013-06-21 21:01:37 +02:00
parent f20e6002cc
commit 61fcbd560e

View File

@@ -147,6 +147,15 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) {
*/ */
this.tileGrid_ = null; this.tileGrid_ = null;
/**
* Tile range before the current animation or interaction. This is updated
* whenever the view is idle.
*
* @private
* @type {ol.TileRange}
*/
this.tileRange_ = null;
/** /**
* @private * @private
* @type {function()} * @type {function()}
@@ -310,11 +319,13 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
resolution = view2DState.resolution, resolution = view2DState.resolution,
extent = frameState.extent, extent = frameState.extent,
layer = this.getVectorLayer(), layer = this.getVectorLayer(),
tileGrid = this.tileGrid_; tileGrid = this.tileGrid_,
tileSize = [512, 512],
idle = !frameState.viewHints[ol.ViewHint.ANIMATING] &&
!frameState.viewHints[ol.ViewHint.INTERACTING];
// lazy tile grid creation // lazy tile grid creation
if (!frameState.viewHints[ol.ViewHint.ANIMATING] && if (idle) {
!frameState.viewHints[ol.ViewHint.INTERACTING]) {
// avoid rendering issues for very high zoom levels // avoid rendering issues for very high zoom levels
var gridResolution = Math.max(resolution, var gridResolution = Math.max(resolution,
ol.renderer.canvas.MIN_RESOLUTION); ol.renderer.canvas.MIN_RESOLUTION);
@@ -323,7 +334,7 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
origin: [0, 0], origin: [0, 0],
projection: view2DState.projection, projection: view2DState.projection,
resolutions: [gridResolution], resolutions: [gridResolution],
tileSize: [512, 512] tileSize: tileSize
}); });
this.tileCache_.clear(); this.tileCache_.clear();
this.tileGrid_ = tileGrid; this.tileGrid_ = tileGrid;
@@ -338,14 +349,15 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
// set up transform for the layer canvas to be drawn to the map canvas // set up transform for the layer canvas to be drawn to the map canvas
var z = tileGrid.getZForResolution(resolution), var tileResolution = tileGrid.getResolution(0);
tileResolution = tileGrid.getResolution(z), if (idle) {
tileRange = tileGrid.getTileRangeForExtentAndResolution( this.tileRange_ = tileGrid.getTileRangeForExtentAndResolution(
extent, tileResolution), extent, tileResolution);
tileRangeExtent = tileGrid.getTileRangeExtent(z, tileRange), }
tileSize = tileGrid.getTileSize(z), var transform = this.transform_,
sketchOrigin = ol.extent.getTopLeft(tileRangeExtent), tileRange = this.tileRange_,
transform = this.transform_; tileRangeExtent = tileGrid.getTileRangeExtent(0, tileRange),
sketchOrigin = ol.extent.getTopLeft(tileRangeExtent);
goog.vec.Mat4.makeIdentity(transform); goog.vec.Mat4.makeIdentity(transform);
goog.vec.Mat4.translate(transform, goog.vec.Mat4.translate(transform,
@@ -432,11 +444,11 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
groups, group, j, numGroups, featuresObject, tileHasFeatures; groups, group, j, numGroups, featuresObject, tileHasFeatures;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y); tileCoord = new ol.TileCoord(0, x, y);
key = tileCoord.toString(); key = tileCoord.toString();
if (this.tileCache_.containsKey(key)) { if (this.tileCache_.containsKey(key)) {
tilesToRender[key] = tileCoord; tilesToRender[key] = tileCoord;
} else if (!frameState.viewHints[ol.ViewHint.ANIMATING]) { } else if (idle) {
tileExtent = tileGrid.getTileCoordExtent(tileCoord); tileExtent = tileGrid.getTileCoordExtent(tileCoord);
tileExtent[0] -= tileGutter; tileExtent[0] -= tileGutter;
tileExtent[1] += tileGutter; tileExtent[1] += tileGutter;