QGraphicsView实现简易地图8『缓存视口周边瓦片』

慈云数据 2024-05-11 技术支持 34 0

前文链接:QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

QGraphicsView实现简易地图8『缓存视口周边瓦片』
(图片来源网络,侵删)

前7篇的地图加载,都采用最少瓦片数量的算法,即用最少数量的瓦片覆盖视口,以获得最快的加载速度。但是这样会带来一个问题,那就是每当移动地图时,视口周边的瓦片才会加载,这样会造成地图的延时甚至卡顿,而这会令用户感到非常反感。为此,需要在之前的算法上进行改进:加载覆盖视口的最少瓦片后,立即加载视口周边瓦片;加载过的瓦片离开视口后不再删除,以加快下次进入视口后的渲染。

1、动态演示效果

QGraphicsView实现简易地图8『缓存视口周边瓦片』
(图片来源网络,侵删)

2、获取视口及周边瓦片代码:以视口宽高的一半向四周扩展

QRect CommonUtility::getViewAndAroundTileCoords(int tempTileTop, int tileLeft, int tempTileBottom, int tileRight, int level, vector &vecTileCoord)
{
	//  视口
	for (int row = tempTileTop; row 
		for (int col = tileLeft; col 
			vecTileCoord.push_back(TileCoord(col, row));
		}
	}
	int mapSize = pow(2, level);
	int tileW = tileRight - tileLeft + 1;
	int tileH = tempTileBottom - tempTileTop + 1;
	int tempTileT, tempTileL, tempTileB, tempTileR;
	int tileT, tileL, tileB, tileR;
	// 
		for (int col = tempTileL; col 
			vecTileCoord.push_back(TileCoord(col, row));
		}
	}
	// 
		for (int col = tempTileL; col 
			vecTileCoord.push_back(TileCoord(col, row));
		}
	}
	// 
		for (int col = tempTileL; col 
			vecTileCoord.push_back(TileCoord(col, row));
		}
	}
	// 
		for (int col = tempTileL; col 
			vecTileCoord.push_back(TileCoord(col, row));
		}
	}
	return QRect(tileL, tileT, (tileR - tileL + 1), (tileB - tileT + 1));
}
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon