2009-09-29 58 views
2

我一直在工作很长时间,一段时间以来我只能描述为“线程画布”。一会儿我会描述我所拥有的东西,但由于我真的愿意接受新的想法,现有的解决方案或全新的开始,我将制定这个问题。用Java绘制在画布上的螺纹SWT

画布旨在显示遗传信息(尽管具体目的有点不相关)。作为传统的文本编辑器,这种遗传代码被绘制到画布上,用户可以通过输入,选择等与画布交互。代码然后进一步用各种非文本特征(例如形状,线条和颜色)进行修饰。

这里的主要问题是需要在显示某些信息之前进行重要的计算。

考虑以下实体模型:

Sample of canvas http://img23.imageshack.us/img23/9931/canvasgv.png

正如你可以看到,遗传密码是等宽,但所述酶切口(遗传密码如上所示)不是。计算酵素切割的地方非常繁琐,因为可能会有很多屏幕显示特征(上图,蓝色箭头)。三字母代码表示三个遗传密码块的翻译;虽然这很快执行,但在该序列中输入单个字母会使它们全部移位 - 需要重新计算。

优选地,为了加快速度,这些部分中的每一个都可以发生在单独的线程中,最终一起来组成最终图像。

总结:显示器的各个部分在计算上都很困难,尽管编辑器尽可能具有尽可能的响应性。

我现在的实现涉及在单个线程中执行所有绘制事件。通过键入,调整大小或进行选择,可以创建大量线程,但只有最近的线程才能更新显示。这可以保证更新显示不会超过一次迭代,但不会提供UI的快速反馈。

我研究过对现有编辑器进行修改,如StyledText,但任何超过某些粗体和颜色的操作都会使其显着变慢。

有什么建议吗?

回答

0

我反而选择了使用多个缓冲区的解决方案,其中每个缓冲区都在单独的线程中绘制。性能是很多比StyledText更好,并且我有完全的灵活性来绘制我喜欢的东西。

唯一的缺点是我必须重新实现文本编辑的基础知识:文本选择,导航 - 甚至是输入字符的基础知识。我对结果满意。

恐怕我无法提供源代码,因为它是版权项目的一部分。

1

可能您最好的选择是在StyledText中嵌入其他SWT小部件。每个小部件将在后台线程中执行一定的计算,并在结果进入时更新其可视表示。请注意,您可以在后台执行计算,但渲染必须发生在SWT线程中。所以在渲染过程中你不能做很多复杂的事情。如果事情变得太慢,请使用缓存图像(创建一些可以渲染结果的屏幕外图像,然后简单地绘制这些图像)。

Canvas扩展这些小部件,因为这是用于自定义呈现的小部件。它也可以让你对不同的事件作出反应(即当用户停留在酶切时显示附加信息)。

虽然酶切时要小心:它们的高度各不相同。我建议在默认情况下给这个小部件多一点空间(即使它没有被使用),这样在小部件计算并添加剪切时,文本不会跳得太多。

+0

好的见解,亚伦。我将介绍如何将小部件嵌入到StyledText中。至于由于酶而跳动的文本:我不认为这很可能,因为这很慢(在大文件中有许多具有正则表达式作为识别序列的酶)。我认为给他们一个最小的显示延迟实际上是一个好主意,这样在较小的文件中它只会在一两秒钟后更新。尽管如此,这确实在细节上。如果我可以将可变大小的小部件放入StyledText,我想我已经到了一半了。 – 2009-09-29 15:34:22

+0

更改小部件的大小应使StyledText自行重新布局。 – 2009-09-29 15:52:38