如何提高SWT绘图性能?

时间:2011-05-17 15:42:06

标签: java performance swt

我被赋予了改善股票市场图表软件性能的任务,该软件使用SWT的GC来绘制图表。图表绘图需要改进,因为图表有时会每秒重绘多次,并且会占用大量处理器时间。

在谷歌搜索后,我发现blog entry建议直接修改ImageData个对象,而不是使用GC的方法,从而获得了巨大的性能提升。

使用这种技术绘制水平和垂直直线和方形形状是一件容易的事,但是当涉及绘制圆形和其他不规则形状时,没有简单的方法。

有没有人知道是否有一个库可以在ImageData个对象上绘制形状,就像GC方法对Image个对象一样?

另外,有没有人知道改善SWT表现的另一种方法?

提前致谢。

3 个答案:

答案 0 :(得分:6)

衡量解决方案的效果。大部分时间花在哪里?猜猜是不够的。在90%的案例中,您的猜测都是错误的。如果您不知道,则无法解决问题。

SWT本身并不慢。实际上,SWT只是相应的OS系统调用绘制的一层非常薄的层。

SWT的一个问题是它是同步的。为了确保线程问题不会导致问题,可以使用全局锁定。因此,如果您一次从多个线程渲染,这可能是一个问题。

或者你可能没有正确地缓存颜色和字体等资源。这些都很昂贵。你创造了多少个GC?你是不是一个人或者你每帧都创建一个新的?

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

答案 1 :(得分:4)

我不会改善绘图程序的性能,而是专注于绘图逻辑。也许你可以重新绘制旧图表和新图表之间的差异?这当然在很大程度上取决于图表的外观以及它们呈现的数据。

尝试减少绘图操作。不要试图让它们更快。

答案 2 :(得分:2)

这看起来似乎是一个很大的进步(但确实如此),但改善SWT绘图性能的最佳方法是切换到OpenGL渲染。我并不是说你应该用它绘制你的整个用户界面,而是图表部分。

有很多方法可以做到这一点。我的选择是使用JOGL library。网络上还有一些例子,展示了如何与SWT集成。

这种方法的缺点是你必须学习和使用一种新的API,它与人们从java中知道的非常不同。

另一方面,随着场景变得越来越复杂,将渲染外部化到GPU的收益也越来越大。我经历了2倍到10倍之间的FPS增益。

另一个好处是你不必深入研究OpenGL,有像jMonkeyEngine这样的大型库,隐藏了很多潜在的复杂性。