我一直在尝试阅读3D引擎开发场景图的不同实现,以了解该领域中使用的设计模式,但不幸的是,代码库太大,我无法掌握(希望如此)。
因此,假设我们有一个Model类,它存储指向几何体、着色器、纹理等的指针,我们希望单独允许每个成员的动画,比如GeometryAnimator、TextureAnimator等,但Model当然也可以是静态的。
我看到的是策略模式(静态实体无操作)和装饰器模式都可以用来实现这一点。这个应用程序中的每一个的优点/缺点是什么?还是说我把事情搞得太复杂了?
谢谢你的帮忙!
发布于 2010-06-25 11:51:56
一个简单但完美的解决方案是为场景节点可以表示的所有不同事物建立接口/abstact基类。
class Texture
{
...
};
class Geometry
{
...
};
// etc
class SceneNode
{
public:
// The following return null by default but
// can be overriden by SceneNode subclasses
// to return interface pointers.
virtual Geometry* geometry()
{
return 0;
}
virtual Texture* texture()
{
return 0;
}
};
class Model: public SceneNode, public Texture, public Geometry
{
public:
// Override the functions of inherited interfaces
virtual Geometry* geometry()
{
return this;
}
virtual Texture* texture()
{
return this;
}
};这实际上是高端3D包以这样或那样的形式采用的方法。使用它,给定任何场景节点,您可以查询它是否支持特定的接口(例如:纹理接口),然后通过该接口进行动画,例如
Maya和XSI执行此操作,但使用的接口方法能够返回所有返回void*的接口,客户端必须相应地强制转换该接口。然后,它们创建引用类型来隐藏所需的强制转换。
对于所有的编程解决方案,您不必总是求助于经典的设计模式。将它们视为工具和建议,但总是询问哪种设计模式适用于给定的问题并不总是导致最直接的解决方案。您必须为自己思考,但设计模式可以帮助您。
发布于 2010-06-25 11:27:37
装饰器模式通常用于不能修改的结构。Strategy模式可以在您完全控制的结构中使用,但也允许其他人更改行为,而不必编写“围绕”它,就像Decorator一样。
发布于 2010-06-25 13:16:42
我觉得你太复杂了。也许一个类(Model)就足够了?记住只封装变化的内容。
如果你认为这还不够,那么策略是可以的。例如,如果您想要使用许多不同的 TextureAnimator类,并且能够在运行时切换它们。
装饰器模式类似于子类化,但可以在运行时完成(并且支持多重继承)。它也很慢(我猜你是在编写一个游戏)。我想这不是一个解决方案。
在这种情况下,我会编写一个类。如果我将来需要策略,我会重构代码。
https://stackoverflow.com/questions/3115314
复制相似问题