我被赋予了改善股票市场图表软件性能的任务,该软件使用SWT的GC
来绘制图表。图表绘图需要改进,因为图表有时会每秒重绘多次,并且会占用大量处理器时间。
在谷歌搜索后,我发现blog entry建议直接修改ImageData
个对象,而不是使用GC
的方法,从而获得了巨大的性能提升。
使用这种技术绘制水平和垂直直线和方形形状是一件容易的事,但是当涉及绘制圆形和其他不规则形状时,没有简单的方法。
有没有人知道是否有一个库可以在ImageData
个对象上绘制形状,就像GC
方法对Image
个对象一样?
另外,有没有人知道改善SWT表现的另一种方法?
提前致谢。
答案 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这样的大型库,隐藏了很多潜在的复杂性。