管线

1、什么是管线

PeriDyno中的管线代表模块的集合,通过模块间的数据连接实现模块的依次调用,最终实现节点的状态变量更新或者为渲染及后处理提供输出数据。

相比于其他管线(如OpenGL管线),PeriDyno管线具备如下特点:

  • 管线入口:统一以节点的状态变量作为管线入口,支持直接对模块状态变量的更新;
  • 模块类型:管线支持的功能模块既可以是仿真计算模块,也可以是渲染模块或者交互模块。不同功能模块可以自由排列组合,从而支持复杂实时可交互场景的建模与仿真;
  • 管线类型:当前实现支持仿真管线渲染管线两种;
  • 更新机制:利用Field的tick()、tack()机制实现数据时间戳同步,保证每个模块只在输入数据或者控制变量更新之后才执行,从而降低冗余计算,具体参见数据同步

以刚体动力学为例,其仿真管线的可视化效果图如下:

2、管线功能

管线继承自模块(Module),除了继承Module的功能之外(如数据管理),还具备如下管线特有功能:

  • 添加模块:

    void pushModule(std::shared_ptr<Module> m);
    
  • 删除模块:

    void popModule(std::shared_ptr<Module> m);
    
  • 更新模块序列:

    void updateExecutionQueue();
    

    该部分算法通过调用有向无环图的拓扑排序(Topological Sorting)实现。

  • 启用/禁用管线:

    void enable();
    void disable();
    
  • 导出模块输出到节点输出:

    void promoteOutputToNode(FBase* base);
    
  • 撤销模块输出:

    void demoteOutputFromNode(FBase* base);
    

    更多管线实现细节,参加 src/Framework/Module/Pipeline.h(cpp)实现。