【问题标题】:Java 2d drawLine slow for long linesJava 2d drawLine 对于长线来说很慢
【发布时间】:2015-07-12 16:30:21
【问题描述】:

我有一段代码需要绘制数千行(6000 到 50000 之间)。

我随后修复了一个不相关的错误,暴露了一些有趣的东西;也就是说,当这些线条很长(比如 30k 像素)时,drawLine 函数占用了我 95% 的代码时间,而线条只有 1000 像素长时,它只占用了 15% 的时间。

线条颜色相同,宽度固定(1px)

为什么长线绘制这么慢?我有哪些选项可以加快速度,而不仅仅是长线,是否有可以使用的渲染提示?我已经在运行这个线程了。

【问题讨论】:

  • 您可以将线条绘制到后备缓冲区(使用BufferedImage),但这可能无法解决问题。如果不知道实际物理绘图过程的底层实现,就不可能知道。下一个问题可能是,你为什么需要这么长的行?
  • @MadProgrammer 通常我不会(不是 30k),但我仍然需要画很长的线(大型网络的可视化),但我确实需要画几千长的线较大的网络,如果我可以在平均情况下利用每条线路的小幅改进,那将是巨大的。奇怪的是,画线(甚至是“快速”线)比构建网络、发现网络结构和运行布局算法的总时间还要长。
  • YakumoYukari 给出了很好的建议:如果您的任何线段超出了显示视口,则可能会影响性能。在绘图之前剪裁肯定会有所帮助。否则:您可能需要考虑使用不同的图形库,例如JOGGLELWJGL
  • @FoggyDay 很少有边缘(主要是短边缘),当我滚动视口时会发生什么,是否需要重新绘制所有新可见的线条?

标签: java awt drawing java-2d


【解决方案1】:

我相信 java drawline 函数,当您在新区域中绘制一条线时(即它只渲染了一个 300x300 的区域,但您将一条线绘制到 200,500),它必须将所有这些像素初始化为可绘制区域。

这是来自类似答案的 sn-p:

“我建议您计算绘画区域的可见部分(使用 JComponent 的 getVisibleRect () 方法或 Graphics g.getClip ().getBounds () 方法)并将您的绘画限制在该区域。

如果组件真的很大(例如组件的面积为 10000x10000 像素),那么这个小的优化可以加快组件的绘制速度。”

【讨论】:

  • 有意思,这个例子中的线条都是从圆的两端走的,所以矩形的边界不会改变。
猜你喜欢
  • 2012-03-24
  • 2010-10-19
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多