more improvements to the data requesting

- fix idle resume, so it only occurs if the existing timer has been cancelled
- re-instate the cache, and updates for interface changes
- add a short delay between the initialisation of map data retreival, and actually starting network requests
This commit is contained in:
Jon Atkins 2013-09-04 04:34:11 +01:00
parent 4ccfbdfa45
commit a77cf50e42

View File

@ -5,7 +5,7 @@
window.MapDataRequest = function() { window.MapDataRequest = function() {
// this.cache = new DataCache(); this.cache = new DataCache();
this.render = new Render(); this.render = new Render();
this.debugTiles = new RenderDebugTiles(); this.debugTiles = new RenderDebugTiles();
@ -24,10 +24,13 @@ window.MapDataRequest = function() {
this.MAX_TILE_RETRIES = 1; this.MAX_TILE_RETRIES = 1;
// refresh timers // refresh timers
this.MOVE_REFRESH = 2.5; //refresh time to use after a move this.DOWNLOAD_DELAY = 2; //delay after preparing the data download before tile requests are sent
this.MOVE_REFRESH = 1; //refresh time to use after a move
this.STARTUP_REFRESH = 5; //refresh time used on first load of IITC this.STARTUP_REFRESH = 5; //refresh time used on first load of IITC
this.IDLE_RESUME_REFRESH = 10; //refresh time used after resuming from idle this.IDLE_RESUME_REFRESH = 5; //refresh time used after resuming from idle
this.REFRESH = 60; //minimum refresh time to use when not idle and not moving
this.REFRESH_CLOSE = 120; // refresh time to use for close views z>12 when not idle and not moving
this.REFRESH_FAR = 600; // refresh time for far views z <= 12
this.FETCH_TO_REFRESH_FACTOR = 2; //refresh time is based on the time to complete a data fetch, times this value this.FETCH_TO_REFRESH_FACTOR = 2; //refresh time is based on the time to complete a data fetch, times this value
// ensure we have some initial map status // ensure we have some initial map status
@ -39,7 +42,7 @@ window.MapDataRequest.prototype.start = function() {
var savedContext = this; var savedContext = this;
// setup idle resume function // setup idle resume function
window.addResumeFunction ( function() { console.log('refresh map idle resume'); savedContext.setStatus('refreshing'); savedContext.refreshOnTimeout(savedContext.IDLE_RESUME_REFRESH); } ); window.addResumeFunction ( function() { savedContext.idleResume(); } );
// and map move start/end callbacks // and map move start/end callbacks
window.map.on('movestart', this.mapMoveStart, this); window.map.on('movestart', this.mapMoveStart, this);
@ -50,6 +53,7 @@ window.MapDataRequest.prototype.start = function() {
this.refreshOnTimeout (this.STARTUP_REFRESH); this.refreshOnTimeout (this.STARTUP_REFRESH);
this.setStatus ('refreshing'); this.setStatus ('refreshing');
this.cache && this.cache.startExpireInterval (15);
} }
@ -85,6 +89,16 @@ window.MapDataRequest.prototype.mapMoveEnd = function() {
this.refreshOnTimeout(this.MOVE_REFRESH); this.refreshOnTimeout(this.MOVE_REFRESH);
} }
window.MapDataRequest.prototype.idleResume = function() {
// if we have no timer set, refresh has gone idle and the timer needs restarting
if (this.timer === undefined) {
console.log('refresh map idle resume');
this.setStatus('idle restart');
this.refreshOnTimeout(this.IDLE_RESUME_REFRESH);
}
}
window.MapDataRequest.prototype.clearTimeout = function() { window.MapDataRequest.prototype.clearTimeout = function() {
@ -128,9 +142,6 @@ window.MapDataRequest.prototype.refresh = function() {
//time the refresh cycle //time the refresh cycle
this.refreshStartTime = new Date().getTime(); this.refreshStartTime = new Date().getTime();
if (this.cache) this.cache.expire();
this.debugTiles.reset(); this.debugTiles.reset();
// a 'set' to keep track of hard failures for tiles // a 'set' to keep track of hard failures for tiles
@ -220,8 +231,11 @@ window.MapDataRequest.prototype.refresh = function() {
} }
} }
this.setStatus ('loading');
this.processRequestQueue(true); // don't start processing the download queue immediately - start it after a short delay
var savedContext = this;
this.timer = setTimeout ( function() { savedContext.timer = undefined; savedContext.processRequestQueue(true); }, this.DOWNLOAD_DELAY*1000 );
} }
@ -253,7 +267,8 @@ window.MapDataRequest.prototype.processRequestQueue = function(isFirstPass) {
if (!window.isIdle()) { if (!window.isIdle()) {
// refresh timer based on time to run this pass, with a minimum of REFRESH seconds // refresh timer based on time to run this pass, with a minimum of REFRESH seconds
var refreshTimer = Math.max(this.REFRESH, duration*this.FETCH_TO_REFRESH_FACTOR); var minRefresh = map.getZoom()>12 ? this.REFRESH_CLOSE : this.REFRESH_FAR;
var refreshTimer = Math.max(minRefresh, duration*this.FETCH_TO_REFRESH_FACTOR);
this.refreshOnTimeout(refreshTimer); this.refreshOnTimeout(refreshTimer);
this.setStatus (this.failedTileCount ? 'errors' : this.staleTileCount ? 'out of date' : 'done', longStatus); this.setStatus (this.failedTileCount ? 'errors' : this.staleTileCount ? 'out of date' : 'done', longStatus);
} else { } else {