Avoid re-rendering framebuffer in simple cases

This commit is contained in:
Tom Payne
2012-09-25 12:53:46 +02:00
parent 1bb2c3c451
commit 06ea619989
+53 -17
View File
@@ -154,6 +154,18 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
*/ */
this.matrix_ = goog.vec.Mat4.createNumber(); this.matrix_ = goog.vec.Mat4.createNumber();
/**
* @private
* @type {ol.TileRange}
*/
this.renderedTileRange_ = null;
/**
* @private
* @type {ol.Extent}
*/
this.renderedFramebufferExtent_ = null;
}; };
goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer); goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer);
@@ -310,6 +322,16 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
var tileResolution = tileGrid.getResolution(z); var tileResolution = tileGrid.getResolution(z);
var tileRange = tileGrid.getTileRangeForExtentAndResolution( var tileRange = tileGrid.getTileRangeForExtentAndResolution(
mapRotatedExtent, tileResolution); mapRotatedExtent, tileResolution);
var framebufferExtent;
if (!goog.isNull(this.renderedTileRange_) &&
this.renderedTileRange_.equals(tileRange)) {
this.logger.info('skipping re-render');
framebufferExtent = this.renderedFramebufferExtent_;
} else {
this.logger.info('re-render');
var tileRangeSize = tileRange.getSize(); var tileRangeSize = tileRange.getSize();
var tileSize = tileGrid.getTileSize(); var tileSize = tileGrid.getTileSize();
@@ -324,7 +346,7 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
var origin = tileGrid.getOrigin(z); var origin = tileGrid.getOrigin(z);
var minX = origin.x + tileRange.minX * tileSize.width * tileResolution; var minX = origin.x + tileRange.minX * tileSize.width * tileResolution;
var minY = origin.y + tileRange.minY * tileSize.height * tileResolution; var minY = origin.y + tileRange.minY * tileSize.height * tileResolution;
var framebufferExtent = new ol.Extent( framebufferExtent = new ol.Extent(
minX, minX,
minY, minY,
minX + framebufferExtentSize.width, minX + framebufferExtentSize.width,
@@ -381,6 +403,8 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
*/ */
var imagesToLoad = []; var imagesToLoad = [];
var allTilesLoaded = true;
tilesToDrawByZ[z] = {}; tilesToDrawByZ[z] = {};
tileRange.forEachTileCoord(z, function(tileCoord) { tileRange.forEachTileCoord(z, function(tileCoord) {
@@ -394,6 +418,7 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
return; return;
} else { } else {
imagesToLoad.push(tile.getImage()); imagesToLoad.push(tile.getImage());
allTilesLoaded = false;
} }
} else { } else {
var tileKey = goog.getUid(tile); var tileKey = goog.getUid(tile);
@@ -403,6 +428,7 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
this.tileChangeListenerKeys_[tileKey] = goog.events.listen(tile, this.tileChangeListenerKeys_[tileKey] = goog.events.listen(tile,
goog.events.EventType.CHANGE, this.handleTileChange, false, this); goog.events.EventType.CHANGE, this.handleTileChange, false, this);
} }
allTilesLoaded = false;
} }
// FIXME this could be more efficient about filling partial holes // FIXME this could be more efficient about filling partial holes
@@ -452,6 +478,32 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
}, this); }, this);
}, this); }, this);
if (!goog.array.isEmpty(imagesToLoad)) {
goog.events.listenOnce(
map,
ol.MapEventType.POST_RENDER,
goog.partial(function(mapRenderer, imagesToLoad) {
if (goog.DEBUG) {
this.logger.info('uploading textures');
}
goog.array.forEach(imagesToLoad, function(image) {
mapRenderer.bindImageTexture(
image, goog.webgl.LINEAR, goog.webgl.LINEAR);
});
}, mapRenderer, imagesToLoad));
animate = true;
}
if (allTilesLoaded) {
this.renderedTileRange_ = tileRange;
this.renderedFramebufferExtent_ = framebufferExtent;
} else {
this.renderedTileRange_ = null;
this.renderedFramebufferExtent_ = null;
}
}
goog.vec.Mat4.makeIdentity(this.matrix_); goog.vec.Mat4.makeIdentity(this.matrix_);
goog.vec.Mat4.translate(this.matrix_, goog.vec.Mat4.translate(this.matrix_,
(mapCenter.x - framebufferExtent.minX) / (mapCenter.x - framebufferExtent.minX) /
@@ -477,22 +529,6 @@ ol.renderer.webgl.TileLayer.prototype.render = function() {
-0.5, -0.5,
0); 0);
if (!goog.array.isEmpty(imagesToLoad)) {
goog.events.listenOnce(
map,
ol.MapEventType.POST_RENDER,
goog.partial(function(mapRenderer, imagesToLoad) {
if (goog.DEBUG) {
this.logger.info('uploading textures');
}
goog.array.forEach(imagesToLoad, function(image) {
mapRenderer.bindImageTexture(
image, goog.webgl.LINEAR, goog.webgl.LINEAR);
});
}, mapRenderer, imagesToLoad));
animate = true;
}
return animate; return animate;
}; };