【问题标题】:Java Path2D performance issueJava Path2D 性能问题
【发布时间】:2014-08-21 06:25:26
【问题描述】:

我有一个利用 Path2D.Float 绘制矢量对象的程序(大型分形设计)。我的代码允许缩放和平移。我有一个轴对象,它具有根据当前缩放设置(存储在轴对象中)将世界坐标(双精度对)转换为显示坐标(浮点数对)的方法。

无论如何,矢量图是大而详细的,并且在世界坐标中包含许多线段。每次用户缩放或平移时,都会创建新的 Path2D 对象并将其渲染到屏幕上。

缩小时一切都非常流畅。当我放大到一定深度时会出现问题。显然 Path2D 线变得很长,这会减慢它们的渲染速度(即使绝大多数都在可视区域之外!)。这不是我的转换算法消耗资源。我对其进行了分析,与小剪辑区域相比,由于线条的大小,它肯定是 Java 图形绘制算法变慢了。

我希望有一种方法可以让 Java 自动处理大行的剪切。在绘制之前,我确实从图形对象调用 setClip()。我不明白什么需要这么多时间。当线条与剪切矩形相比较长时,剪切算法是否存在问题/效率低下?到目前为止,我认为我没有缩放到我从世界坐标到显示坐标的转换导致溢出。我得检查一下。如果是这种情况,我会尝试使用 Path2D.double。

无论如何,任何帮助表示赞赏。我相信我最终会解决这个问题,但我希望遇到同样问题的人可以给我一个指点,这样就不会花很长时间才能弄清楚。

【问题讨论】:

  • 而不是每次都重新生成 Shape2D 向量,您可以简单地请求一个缩放的实例,您还可以查看用于绘制视图的 Graphics2D 的剪切矩形并确定给定的形状是否相交它,如果没有,甚至不要尝试绘制它

标签: java graphics2d zooming clipping path-2d


【解决方案1】:

我在缩放时没有使用路径,但我用它们来绘制一些非常复杂的带有纹理和渐变等的形状。我遇到的一些问题是:

根据我的经验,由于性能问题,我不得不避免在每帧的基础上创建新的 Path2D 对象,这不仅是因为它们的娱乐执行,而且因为它会导致大量垃圾收集,并很快生成然后丢弃这么多,这减慢了速度。如果你的形状没有改变,缓存生成的路径。

避免使用路径进行剪裁 - 尽可能坚持使用矩形 - 路径似乎会在曲线上产生粗糙的边缘并且使用成本更高。

即使在剪裁到较小的区域时,仅要求绘制较大的区域也可能会减慢速度。考虑当用户放大以镶嵌您的形状时,即形状仅与您的视口一样大。也许正如您所说,在处理大体积区域时,剪辑功能可能存在问题,因此细分可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多