用java2d绘制复杂生成图像

用java2d绘制复杂生成图像,java,swing,opengl,Java,Swing,Opengl,我有一个非常大的复杂的图表,需要在飞行中绘制 我已经在使用双缓冲技术来绘制图像(从这个答案:),但是,正在绘制的生成图像太大,无法绘制为单个图像(并且绘制所需的多个图像不能同时存储在内存中)。因此,我绘制视图的当前可见区域+一些边距。当我滚动时,我画下下一个区域,并从内存中删除我们刚来的区域。但是,如果用户随后决定改变方向,则需要等待该区域再次绘制。我的问题是: 如果正在绘制的屏幕的单个“帧”约为1000*1000像素,其中绘制了约5000条线/圆(图形的节点/边缘),则每次重新绘制此图像是否可

我有一个非常大的复杂的图表,需要在飞行中绘制

我已经在使用双缓冲技术来绘制图像(从这个答案:),但是,正在绘制的生成图像太大,无法绘制为单个图像(并且绘制所需的多个图像不能同时存储在内存中)。因此,我绘制视图的当前可见区域+一些边距。当我滚动时,我画下下一个区域,并从内存中删除我们刚来的区域。但是,如果用户随后决定改变方向,则需要等待该区域再次绘制。我的问题是:

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


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

我想到了几件事:

  • 验证你的工作假设;在目标平台上对动画预算进行自计时以进行比较,如下所示

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

  • >P>如果您的框架具有合适的几何结构,请考虑采用for绘制;code>JTable就是一个例子;使用
    CellRenderPane
    检查了底层机制


非常感谢您的回答-它实际上没有“帮助”,但它让我开始考虑其他问题,这最终成为了问题所在,我没有缓存节点的值-非常尴尬。但这很奇怪,因为确定节点位置的计算并不特别密集(确实涉及除法和模运算)。无论如何,仅仅缓存这些值就意味着绘制每帧所需的时间不是20多秒,而是接近1秒。你提供的链接可能不够大-我正在查看的图有超过400000个节点,边数是原来的两倍;组件的
GridLayout
落后于低千,而
JTable
则扩展到数百万
JGraph
也使用该模式;请考虑更新或您的问题,以反映您的发现。只是我理解,似乎你是在建议我用表格画出不同的图像,需要画出来。这听起来是个不错的主意,但我不确定如何实现它,可能是因为您的回答表明每个单元格都有一个唯一的可见区域,我只想将该可见区域传递给我当前的绘图系统?@ZackNewsham:custom
JTable
渲染器不是个坏主意;请参阅上面的渲染链接。嘿,我只是想让你知道我使用了自定义渲染器,使我的实现稍微慢了一点(处理这个问题),但更加一致。