2013-04-16 61 views
3

一些程序(即声音合成,程序纹理生成...)为用户提供了完全的自由,通过图形编辑器以任意方式安排程序的各种功能。用户可以放置一个或多个“节点”(每个节点代表某种功能,从一个或多个输入生成一个或多个输出),并以任何所需方式将它们连接/连接在一起,以生成最终输出。哪些数据结构用于基于节点的编辑器?

我不知道这样的软件最好的表现可能是必要的数据结构方面,都为发电机系统本身以及它的图形表示。对于如何模拟节点输入和输出可能具有各种数据类型以及根据节点类型只有其中一些可能有效的事实,我尤其困惑。

所以如何建模:

  • 节点输入/输出值
  • 节点本身(?继承)和它们的连接
  • 的生成处理中,从开始节点传播到输出节点
+2

这是一个相当开放的问题......它很有趣。 – Caribou

+1

这里没有看到任何C++。 –

+0

听起来可能值得研究'boost :: graph'库。 – mark

回答

1

我一直在参与这样的一些系统。有很多不同的做事方式。但我过去做过的一种常见方式是让Node对象链接到其他Node对象。节点通过一些IAction接口包含一个操作对象。用户以某种方式指定在特定节点处实现IAction接口的具体动作对象(这通常还涉及指定对象的某种状态,例如,要应用的过滤器的参数)。

然后有一个初始化(编译)并执行(运行)图的框架,并且当输入准备就绪时,安排调用IAction接口和节点的输入,并将输出传递给下游节点。这是一个非常简单的算法:并行运行所有节点都存在的输入(从没有输入的节点开始),并将剩下的节点放在等待队列中,直到其输入存在。

这仅仅是如何做到这一点一个味;有很多变化,并且有很多系统使用这种技术,正如您已经指出的那样。也有一些框架(TPL Dataflow就是这样,,如果我已经明白了)。

重新提出关于如何确保节点间连接一致的问题,在我看来,这取决于框架的多少和节点的多少。在极端情况下,框架可以在图形“编译时”严格地匹配连接类型;另一方面,框架可以将其留给节点在“运行时间”进行检查。如果大多数连接只是相同的类型,例如后者可能是合适的。例如,它们都是字节流。

btw在Java或C#(或另一个HLL)中,这可能比C++更容易,因为接口,反射,动态加载对象等都有更多支持(例如在C#中,您可以轻松指定键入一个对象并从一个流中动态创建它,而你必须用C++自己编译它)。

0

你可能想看看观察者模式,特别是信号/这种类型的事情插槽的系统。 Observer PatternBoost.Signals

一个项目我的工作,而回用C++中使用的信号/槽,以允许不同的音频合成模块,以动态地在运行时由用户连接。尽管如此,可以在性能方面进行权衡。

作为建模不同的可能输入,你可以使一个信号目的是包含实际的数据作为一个空指针和一个字符串或枚举指定哪些接收的类假定是在加工过程中正确的数据类型。当你的用户最初连接这些对象时,可以返回一种契约('这些是这个对象发送的类型'),实际的验证可以在处理开始之前完成。