1

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2014-06-30T19:48:34.547 回答