个人看法,仅供参考啊。如有不对请批评指正。
软件工程中,当我们设计软件之初,要进行框架设计,为了我们的设计灵活,更具有弹性,我们经常思考的是将变化的部分和不会变化的部分分开。这样可以让软件开发更规范,更易于扩展,更容易维护,设计模式的很多思想都源于此。
那么,对于一个graphic pipeline的设计,从软件的角度来说,什么是不变的,什么是经常变化的?
针对attila来说,pipeline的功能,数据的传输和逻辑的控制是不变的,具体来说,就是unit 的功能(比如PrimitiveAssembly是图元装配,但具体怎么装配呢?),unit与unit之间signal的连接建立,数据经由signal的传输,unit状态的控制,read signal and wirte signal .....这些是框架上的东西,是不变的。 变化的是功能的实现,也就是算法,attila的rasterizer就是由两种不同的算法来实现同样的功能。因此,要将功能和不同的算法实现相分离,而不是纠结在一起。这也是Sim工程(功能)和emul(不同算法)工程的由来。
attila的这种思想,源自于一种叫strategy的策略模式,策略模式定义了一组算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于算法使用的客户,也就是功能和实现的分离。