【问题标题】:drawing complex generated image in java 2d在java 2d中绘制复杂的生成图像
【发布时间】:2013-12-06 02:02:12
【问题描述】:

我有一个非常大的复杂图表,需要即时绘制。

我已经在使用双缓冲技术来绘制图像(来自这个答案:Using threads to paint panel in java)但是,正在绘制的生成图像太大以至于不能绘制为单个图像(以及多个图像需要绘制它不能同时存储在内存中)。出于这个原因,我绘制了视图的当前可见区域 + 一些边距。当我滚动时,我绘制下一个将要出现的区域,并从内存中删除我们刚刚来自的区域。但是,如果用户随后决定改变方向,他们需要等待该区域再次被绘制。我的问题是这样的:

如果正在绘制的屏幕的单个“帧”大约为 1000*1000 像素,其中绘制了大约 5000 条线/圆(图形的节点/边缘),那么每个重新绘制此图像可能会更有效时间,或者有没有办法将图像有效地缓存到硬盘(以避免java堆限制)。

我已经尽我所能优化了绘制方法,但是如果用户快速滚动到,仍然会有几秒钟的延迟(即在绘制下一组“帧”之前移出绘制区域) .所以我的第二个问题是:迁移到 OpenGL 会带来很大的改进,是否需要对代码的基础结构进行重大更改? (几天前我尝试过这样做,发现它并不像我想象的那么简单 - 经常导致计算机崩溃)。

【问题讨论】:

    标签: java swing opengl


    【解决方案1】:

    我想到了几件事:

    • Profile 验证您的工作假设;在您的目标平台上自拍动画预算以进行比较,如AnimationTest所示。

    • 将您的方法与引用的示例here 进行比较;它可以扩展到 1000 个,并且可以将选择拖到数百个。

    • 如果您的帧具有合适的几何形状,请考虑采用flyweight pattern 进行渲染; JTable rendering 就是一个例子;使用CellRendererPane 的底层机制已检查here

    【讨论】:

    • 非常感谢您的回答 - 它实际上并没有“帮助”,但它让我看到了其他东西,这最终成为问题,我没有缓存节点的值 - 非常尴尬。不过这很奇怪,因为确定节点位置的计算并不是特别密集(尽管确实涉及除法和取模)。无论如何,仅仅缓存这些值意味着绘制每一帧不需要花费 20 多秒,而是需要接近 1 秒。您提供的链接可能无法扩展 - 我正在查看的图表有超过 400,000 个节点,并且在边上增加了一倍。
    • 很高兴你得到了整理和良好的观察; GridLayout 的组件落后于数千,而 JTable 扩展到数百万; JGraph 也使用该模式;请考虑更新或answering您的问题以反映您的发现。
    • 我明白了,你好像是在建议我用表格来绘制需要绘制的不同图像?这实际上听起来是个好主意,但我不确定我将如何实现它,大概正如您的回答所暗示的那样 每个单元格都有一个独特的可见区域,我只需将该可见区域传递给我当前的绘图系统?
    • @ZackNewsham:自定义JTable 渲染器不错;请参阅上面的渲染链接。
    • 嘿,只是想让你知道我使用了自定义渲染器,这让我的实现慢了一点(正在处理这个问题)但更加一致。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多