我有一个程序,利用Path2D.Float来绘制一个矢量对象(一个大的分形设计)。我的代码允许缩放和平移。我有一个axis对象,它具有根据当前缩放设置(存储在axis对象中)将世界坐标(双精度对)转换为显示坐标(浮点数对)的方法。
无论如何,矢量图形是大而详细的,并且包含世界坐标中的许多线段。用户每次缩放或平移时,都会创建新的Path2D对象并渲染到屏幕上。
缩小后,一切都非常平滑。当我放大到某个深度时,问题就出现了。显然,Path2D行变得很长,这会减慢它们的渲染速度(即使绝大多数都在查看区域之外!)。消耗资源的不是我的转换算法。我对它进行了分析,与较小的裁剪区域相比,由于线条的大小,Java图形绘制算法确实变慢了。
我希望有一种方法可以让Java自动处理大行的裁剪。在绘图之前,我确实从图形对象调用了setClip()。我不明白是什么花了这么多时间。与裁剪矩形相比,当线条较长时,裁剪算法是否存在问题/效率低下?我不认为我缩放得太远,以至于我从世界坐标到显示坐标的转换会导致溢出。我得去看看这个。如果是这样的话,我将尝试使用Path2D.double。
无论如何,感谢您的帮助。我相信我最终会解决这个问题,但我希望遇到同样问题的人能给我一个指针,这样它就不会花太长时间来解决这个问题。
发布于 2014-06-30 19:48:35
我没有在缩放时使用路径,但我使用它们来绘制一些带有纹理和梯度等的非常复杂的形状。我有一些问题:
在我的经验中,我不得不避免在每个帧的基础上创建新的Path2D对象,因为性能问题,不仅是为了它们的重新执行,而且因为它导致了大量的垃圾回收,然后如此迅速地生成和删除许多垃圾收集,这减慢了速度。如果您的形状没有更改,请缓存生成的路径。
避免使用路径裁剪-如果可能的话,坚持使用矩形-路径似乎在曲线上提供粗糙的边缘,并且使用成本更高。
即使裁剪到较小的区域,简单地要求绘制较大的区域也可能会减慢速度。考虑用户何时放大以细分形状,即形状仅与视口大小相同。也许正如你所说,在处理大体积区域时,裁剪功能可能存在问题,因此镶嵌可能会在这里有所帮助。
https://stackoverflow.com/questions/24497631
复制