我目前正在尝试改进地图渲染库的性能。在准时符号的情况下,图书馆经常在每个位置上一次又一次地绘制相同的图像。但是绘制过程可能非常复杂,因为符号的参数化非常丰富。对于每个点,我都有一个树结构来计算要绘制的图像。当参数不依赖于我正在处理的数据时,如前所述,我只是多次绘制一个复杂的符号。图像缓存和性能
我试着实现一个缓存机制。我存储已经绘制的图像,如果我遇到已经满足的配置,我会得到图像并再次绘制。我做的第一个测试是一个非常简单的符号。这是一个圆形,其形状和内部都充满了。
因为我知道符号在所有位置都是不变的,所以我将它缓存起来,然后再从缓存的图像中绘制出来。这有效......但我面临两个重要问题:
- 绘制的符号的质量很难被破坏。
- 问题更多:渲染地图所需的时间与缓存相比,无需缓存。这对于高速缓存^ _^
当缓存机制上的核心代码非常令人失望的是:在drawCachedImageOnGeometry取得
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);
}
唯一有趣的通话
g2.drawRenderedImage(bi, AffineTransform.getTranslateInstance(x-100,y-100));
我已经尝试过使用VolatileImage实例而不是BufferedImage,但是这会导致更深的问题(我无法确定每次需要时都会正确呈现图像)。
我也做了一些分析,看来在使用我的缓存时,花费最长时间的操作是在awt中进行的渲染操作。
这么说,我想我的策略是错误的......因此,我的问题是:
- 是否有任何有效的方式来实现我已经解释的目标是什么?
- 更准确地说,存储用于绘制我的符号的AWT指令并根据需要翻译它们会更快吗?我假设可以检索用于构建符号的“命令”......但是我没有在万维网上找到很多有关这方面的信息,但是......如果可能的话,那将节省我都是符号的计算时间(如前所述,这可能非常复杂)以及我的符号的质量。
预先感谢所有的信息和资源,你给我:-)
Agemen。
编辑:这里是一些关于可以呈现的图形的细节。根据我正在实施的符号体系模型,图形可以非常简单(即其形状为实心正方形)以及非常复杂(例如,标签的形状和填充都用阴影绘制,即使光环如果我想要的话)。我想使用缓存,因为我敢肯定,在大多数配置中我将能够:
- differenciate已被用于绘制有风格具有相同的同一源的两个不同的符号参数样式。
- 确保具有相同参数(位置除外)的两个源将为相同样式生成相同的符号,但在两个不同的位置(仅需要翻译)。
由于这两点,缓存似乎是一个很好的策略。而且,在同一图像中可能会绘制数千个重复的符号。
我会添加有关我可能会遇到操作索姆细节。我很高兴读你2):-) 3)我的缓存图像只需要进行翻译(见我的编辑)4)我会尽可能快地提高了这一点,并让你知道。 – Agemen 2012-07-13 20:38:38