我目前正在尝试提高地图渲染库的性能。在准时符号的情况下,图书馆真的经常只是在每个位置一次又一次地绘制相同的图像。但是,绘制过程可能非常复杂,因为符号的参数化确实非常丰富。对于每个点,我都有一个树结构来计算要绘制的图像。当参数不依赖于我正在处理的数据时,正如我之前所说,我只是画了几次复杂的符号。
我试图实现一个缓存机制。我把已经绘制好的图片存储起来,如果遇到已经满足的配置,就获取图片再绘制。我所做的第一个测试是针对一个非常简单的符号。这是一个形状和内部都被填充的圆圈。
我知道这个符号在所有位置都是不变的,我缓存它然后从缓存的图像中再次绘制它。这有效......但我面临两个重要问题:
- 绘制符号的质量几乎没有损坏。
- 更多问题:使用缓存渲染地图所需的时间确实比没有缓存的时间要长。这对于缓存来说非常令人失望^_^
开启缓存机制时的核心代码如下:
if(pc.isCached(map)){
BufferedImage bi = pc.getCachedValue(map);
drawCachedImageOnGeometry(g2, sds, fid, selected, mt, the_geom, bi);
} else {
BufferedImage bi = g2.getDeviceConfiguration().createCompatibleImage(200, 200);
Graphics2D tg2 = bi.createGraphics();
graphic.draw(tg2, map, selected, mt, AffineTransform.getTranslateInstance(100, 100));
drawCachedImageOnGeometry(g2, sds, fid, selected, mt, the_geom, bi);
pc.cacheSymbol(map, bi);
}
drawCachedImageOnGeometry 中唯一有趣的调用是
g2.drawRenderedImage(bi, AffineTransform.getTranslateInstance(x-100,y-100));
我已经尝试使用 VolatileImage 实例而不是 BufferedImage ......但这会导致更深层次的问题(我无法确定每次需要时都能正确渲染图像)。
我也做了一些分析,似乎在使用我的缓存时,花费时间最长的操作是在 awt 中进行的渲染操作。
也就是说,我想我的策略是错误的......因此,我的问题是:
- 有没有什么有效的方法可以实现我解释的目标?
- 更准确地说,存储用于绘制我的符号并根据需要翻译它们的 AWT 指令会更快吗?我假设有可能检索用于构建符号的“命令”......我没有在万维网上找到很多关于它的信息......如果可能的话,那将节省符号的计算时间(如前所述,这可能非常复杂)和符号的质量。
提前感谢您提供给我的所有信息和资源:-)
年龄。
编辑:这里有一些关于可以渲染的图形的细节。根据我正在实现的符号系统模型,图形可以非常简单(即带有形状的实心正方形)也可以非常复杂(例如,形状和填充都用影线绘制的标签,即使是光环如果我愿意,可以围绕它)。我想使用缓存,因为我确信在大多数配置中我将能够:
- 区分用于绘制具有相同样式的相同源的两个不同符号的参数。
- 确保具有相同参数的两个源(位置除外)将为相同的样式生成相同的符号,但在两个不同的位置(只需要翻译)。
由于这两点,缓存似乎是一个不错的策略。此外,可能有数千个重复的符号要绘制在同一图像中。