如何提高SWT绘图性能?

3
我被分配任务,需要改进使用SWT的GC绘制图表的股票市场图表软件的性能。由于图表有时需要每秒重绘多次,并且消耗大量处理器时间,因此需要改进图表绘制。
在谷歌搜索一番后,我找到了一篇博客文章,建议直接修改ImageData对象而不是使用GC的方法,承诺可以获得巨大的性能提升。
使用这种技术绘制水平和垂直直线以及正方形形状很容易,但是绘制圆形和其他不规则形状就没有简单的方法。
是否有人知道是否有库可以在ImageData对象上绘制形状,就像GC的方法在Image对象上做的那样?
另外,是否还有其他改进SWT性能的方法?
提前致谢。

我在回答另一个问题时偶然发现了这个链接,可能对您有所帮助。链接为http://pub.cosylab.com/CSS/DOC-SWT_Vs._Swing_Performance_Comparison.pdf。 - dfb
很遗憾,使用SWT绘制图形时无法获得良好的性能。每次调用绘图API都需要付出一定的代价,这是我们无法消除的。 - jeeeyul
考虑嵌入一个网页浏览器并使用HTML Canvas API。 - jeeeyul
3个回答

7

测量您的解决方案性能。大部分时间都花在哪里?仅凭猜测是不够的。在90%的情况下,您的猜测将是错误的。如果您不知道问题所在,就无法解决问题。

SWT本身并不慢。实际上,SWT只是一个非常薄的层,覆盖了各自的操作系统系统调用以进行绘制。

SWT的问题之一是它是同步的。为了确保线程问题不会引起问题,存在全局锁定。因此,如果您同时从多个线程渲染,则可能会出现问题。

或者您没有正确地缓存资源,例如颜色和字体。这些创建成本很高。您创建了多少个GC?您是否保留一个或每帧都创建一个新的?

但我只是在猜测。除非您能够通过性能监视器证明“大部分时间花费在......”,否则无法帮助您。


4

不要只着眼于提高绘图例程的性能,而是应该集中精力优化绘图逻辑。也许你可以只重绘旧图表和新图表之间的差异?当然,这在很大程度上取决于图表的外观和呈现的数据。

尽量减少绘图操作,而不是试图让它们更快。


1
将背景(刻度、标签、网格)渲染成图像,并使用该图像设置您的渲染区域。然后在其上方绘制图表本身。 - Aaron Digulla

2
这段文字的意思是:使用OpenGL渲染可以提高SWT绘图性能,虽然需要学习新的API,但对于复杂场景,将渲染外部化到GPU中可以获得更高的帧率。建议使用JOGL library来实现,也可以使用jMonkeyEngine等库来隐藏底层复杂性。

JOGL、SWT代码片段和jMonkeyEngine的链接已失效。 - Hauke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接