|
|
在实现粒子系统时,我看到很多实现是基于多态和虚函数的.比如:
class CParticleObject
{
...
public:
virtual void reset();
virtual HRESULT Init();
//virtual void InvalidateDeviceObjects();
virtual void resetParticle(Attribute* attribute) = 0; 态
virtual void addParticle(); //增加粒子
//virtual void update() = 0;
virtual HRESULT SetScene() = 0; virtual void preRender(); virtual HRESULT CY_Render();
virtual void postRender();
...
};
但是这样会带来不少额外的开销:
1.空间开销:每个继承的类都要维护虚函数表
2.时间开销:在主循环的UPDATE中,调用函数要通过v_table并间接访问.
我觉得在我们使用粒子系统的时候,无论是瀑布还是烟雾,我们都是预先知道的,所以使用多态并不必要,若使用模板特化,就可以消除这些开销.再结合Modern c++ design中的Policy思想,可以构件可扩展并且高效的粒子系统引擎:
template <class ParticleType, class ColorPolicy, class SizePolicy,
class VelocityPolicy, class LifePolicy, class PositionPolicy>
class CompletePolicy {
public :
PositionPolicy d_PositionPolicy;
ColorPolicy d_ColorPolicy;
SizePolicy d_SizePolicy;
VelocityPolicy d_VelocityPolicy;
LifePolicy d_LifePolicy;
inline void PrepareAction() throw() {
d_PositionPolicy.PrepareAction();
d_VelocityPolicy.PrepareAction();
d_SizePolicy.PrepareAction();
d_ColorPolicy.PrepareAction();
d_LifePolicy.PrepareAction();
}
inline void operator()(ParticleType& m_Particle) const throw() {
d_PositionPolicy(m_Particle);
d_ColorPolicy(m_Particle);
d_SizePolicy(m_Particle);
d_VelocityPolicy(m_Particle);
d_LifePolicy(m_Particle);
}
};
这样,我们把复杂度全抛给编译器,早绑定可以显著提升运行时的效率.
请大家提提意见. [em13] |
|