@@ -71,6 +71,7 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
7171 this . tilesLoading = { } ;
7272 this . _parentTiles = [ ] ;
7373 this . _childTiles = [ ] ;
74+ this . _tileQueue = [ ] ;
7475 this . tileCache = new LRUCache ( layer . options [ 'maxCacheSize' ] , this . deleteTile . bind ( this ) ) ;
7576 if ( Browser . decodeImageInWorker && this . layer . options [ 'decodeImageInWorker' ] && ( layer . options [ 'renderer' ] === 'gl' || ! Browser . safari ) ) {
7677 this . _tileImageWorkerConn = new TileWorkerConnection ( ) ;
@@ -94,29 +95,36 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
9495 return ;
9596 }
9697 }
97- let tileGrids ;
98+ if ( ! context || context && context . isFinalRender ) {
99+ // maptalks/issues#10
100+ // 如果consumeTileQueue方法在每个renderMode都会调用,但多边形只在fxaa mode下才会绘制。
101+ // 导致可能出现consumeTileQueue在fxaa阶段后调用,之后的阶段就不再绘制。
102+ // 改为consumeTileQueue只在finalRender时调用即解决问题
103+ this . _consumeTileQueue ( ) ;
104+ }
105+ let currentTiles ;
98106 let hasFreshTiles = false ;
99- const frameTileGrids = this . _frameTileGrids ;
100- if ( frameTileGrids && timestamp === frameTileGrids . timestamp ) {
101- if ( frameTileGrids . empty ) {
107+ const frameTiles = this . _frameTiles ;
108+ if ( frameTiles && timestamp === frameTiles . timestamp ) {
109+ if ( frameTiles . empty ) {
102110 return ;
103111 }
104- tileGrids = frameTileGrids ;
112+ currentTiles = frameTiles ;
105113 } else {
106- tileGrids = this . _getTilesInCurrentFrame ( ) ;
107- if ( ! tileGrids ) {
108- this . _frameTileGrids = { empty : true , timestamp } ;
114+ currentTiles = this . _getTilesInCurrentFrame ( ) ;
115+ if ( ! currentTiles ) {
116+ this . _frameTiles = { empty : true , timestamp } ;
109117 this . completeRender ( ) ;
110118 return ;
111119 }
112120 hasFreshTiles = true ;
113- this . _frameTileGrids = tileGrids ;
114- this . _frameTileGrids . timestamp = timestamp ;
115- if ( tileGrids . loadingCount ) {
116- this . loadTileQueue ( tileGrids . tileQueue ) ;
121+ this . _frameTiles = currentTiles ;
122+ this . _frameTiles . timestamp = timestamp ;
123+ if ( currentTiles . loadingCount ) {
124+ this . loadTileQueue ( currentTiles . tileQueue ) ;
117125 }
118126 }
119- const { tiles, childTiles, parentTiles, placeholders, loading, loadingCount } = tileGrids ;
127+ const { tiles, childTiles, parentTiles, placeholders, loading, loadingCount } = currentTiles ;
120128
121129 this . _drawTiles ( tiles , parentTiles , childTiles , placeholders , context ) ;
122130 if ( ! loadingCount ) {
@@ -135,10 +143,16 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
135143 }
136144 }
137145
146+ getTileGridsInCurrentFrame ( ) {
147+ return this . _frameTileGrids ;
148+ }
149+
138150 _getTilesInCurrentFrame ( ) {
139151 const map = this . getMap ( ) ;
140152 const layer = this . layer ;
141- const tileGrids = layer . getTiles ( ) . tileGrids ;
153+ let tileGrids = layer . getTiles ( ) ;
154+ this . _frameTileGrids = tileGrids ;
155+ tileGrids = tileGrids . tileGrids ;
142156 if ( ! tileGrids || ! tileGrids . length ) {
143157 return null ;
144158 }
@@ -167,7 +181,10 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
167181 const tileGrid = tileGrids [ i ] ;
168182 const allTiles = tileGrid [ 'tiles' ] ;
169183
170- const placeholder = this . _generatePlaceHolder ( tileGrid . zoom ) ;
184+ let placeholder ;
185+ if ( allTiles . length ) {
186+ placeholder = this . _generatePlaceHolder ( allTiles [ 0 ] . res ) ;
187+ }
171188
172189 for ( let j = 0 , l = allTiles . length ; j < l ; j ++ ) {
173190 const tile = allTiles [ j ] ,
@@ -305,6 +322,9 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
305322
306323 needToRedraw ( ) {
307324 const map = this . getMap ( ) ;
325+ if ( this . _tileQueue . length ) {
326+ return true ;
327+ }
308328 if ( map . getPitch ( ) ) {
309329 return super . needToRedraw ( ) ;
310330 }
@@ -456,6 +476,30 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
456476 }
457477
458478 onTileLoad ( tileImage , tileInfo ) {
479+ this . _tileQueue . push ( { tileInfo : tileInfo , tileData : tileImage } ) ;
480+ }
481+
482+ _consumeTileQueue ( ) {
483+ let count = 0 ;
484+ const limit = this . layer . options [ 'tileLimitPerFrame' ] ;
485+ const queue = this . _tileQueue ;
486+ /* eslint-disable no-unmodified-loop-condition */
487+ while ( queue . length && ( limit <= 0 || count < limit ) ) {
488+ const { tileData, tileInfo } = queue . shift ( ) ;
489+ if ( ! this . checkTileInQueue ( tileData , tileInfo ) ) {
490+ continue ;
491+ }
492+ this . consumeTile ( tileData , tileInfo ) ;
493+ count ++ ;
494+ }
495+ /* eslint-enable no-unmodified-loop-condition */
496+ }
497+
498+ checkTileInQueue ( ) {
499+ return true ;
500+ }
501+
502+ consumeTile ( tileImage , tileInfo ) {
459503 if ( ! this . layer ) {
460504 return ;
461505 }
@@ -535,7 +579,7 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
535579 const map = this . getMap ( ) ,
536580 zoom = map . getZoom ( ) ,
537581 ctx = this . context ,
538- cp = map . _pointToContainerPoint ( point , tileZoom , 0 , TEMP_POINT ) ,
582+ cp = map . _pointAtResToContainerPoint ( point , tileInfo . res , 0 , TEMP_POINT ) ,
539583 bearing = map . getBearing ( ) ,
540584 transformed = bearing || zoom !== tileZoom ;
541585 const opacity = this . getTileOpacity ( tileImage ) ;
@@ -763,14 +807,14 @@ class TileLayerCanvasRenderer extends CanvasRenderer {
763807 tile . image . onerror = null ;
764808 }
765809
766- _generatePlaceHolder ( z ) {
810+ _generatePlaceHolder ( res ) {
767811 const map = this . getMap ( ) ;
768812 const placeholder = this . layer . options [ 'placeholder' ] ;
769813 if ( ! placeholder || map . getPitch ( ) ) {
770814 return null ;
771815 }
772816 const tileSize = this . layer . getTileSize ( ) ,
773- scale = map . _getResolution ( z ) / map . _getResolution ( ) ,
817+ scale = res / map . _getResolution ( ) ,
774818 canvas = this . _tilePlaceHolder = this . _tilePlaceHolder || Canvas . createCanvas ( 1 , 1 , map . CanvasClass ) ;
775819 canvas . width = tileSize . width * scale ;
776820 canvas . height = tileSize . height * scale ;
0 commit comments