在java 2d中绘制复杂生成的图像

时间:2013-12-06 02:02:12

标签: java swing opengl

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

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

如果正在绘制的屏幕的单个“帧”大约为1000 * 1000像素,其中绘制了大约5000行/圆(图的节点/边),则每个重绘此图像可能更有效时间,还是有办法将图像有效地缓存到硬盘上(以避免java堆限制)。

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

1 个答案:

答案 0 :(得分:2)

有些事情会浮现在脑海中:

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

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

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