我有一个程序利用Path2D.Float绘制一个矢量对象(一个大的分形设计)。我的代码允许缩放和平移。我有一个轴对象,它具有根据当前缩放设置(存储在轴对象中)将世界坐标(双精度对)转换为显示坐标(浮动对)的方法。
无论如何,矢量图形很大且很详细,并且在世界坐标中包含许多线段。每次用户缩放或平移时,都会创建新的Path2D对象并将其渲染到屏幕上。
缩小时一切都非常流畅。当我放大到一定深度时会出现问题。显然,Path2D线条变得非常长,这会减慢渲染速度(即使绝大多数都在观察区域之外!)。这不是我的转换算法消耗资源。我描述了它,它肯定是Java图形绘制算法,由于与小剪切区域相比的线条大小而减慢。
我希望有一种方法可以让Java自动处理大行的剪切。我在绘图之前从图形对象中调用setClip()。我不知道花了那么多时间。当剪切矩形比较长时,裁剪算法是否存在问题/效率低下的问题?我不认为我缩放到目前为止我从世界坐标到显示坐标的转换导致溢出。我必须检查这个。如果是这种情况,我将尝试使用Path2D.double。
无论如何,任何帮助表示赞赏。我确定我最终会弄清楚这一点,但我希望遇到同样问题的人可以给我一个指针,这样就不用花这么长时间才弄明白。
答案 0 :(得分:0)
我在缩放时没有使用路径,但是我用它们来绘制一些非常复杂的纹理和纹理形状。渐变等我遇到的一些问题是:
根据我的经验,我不得不避免在每帧的基础上创建新的Path2D对象,因为性能问题,不仅仅是因为它们的娱乐执行,而是因为它导致大量的垃圾收集与生成和放大。然后如此迅速地下降这么多,这减缓了事情。如果您的形状没有改变,请缓存生成的路径。
避免使用路径进行裁剪 - 尽可能坚持使用矩形 - 路径似乎会在曲线上产生粗糙边缘并且使用成本更高。
即使剪裁到较小的区域,仅仅要求绘制大区域也会减慢速度。考虑用户何时放大以细分您的形状,即形状仅与视口一样大。也许正如您所说,在处理大容量区域时,剪辑功能可能存在问题,因此曲面细分可能对此有所帮助。