游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2203|回复: 6

多态还是模板特化

[复制链接]

23

主题

63

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2006-12-14 09:59:00 | 显示全部楼层 |阅读模式
在实现粒子系统时,我看到很多实现是基于多态和虚函数的.比如:
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]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-12-14 13:44:00 | 显示全部楼层

Re:多态还是模板特化

粒子系统包含一个粒子编辑器,而粒子编辑器输出的内容是动态的读入到引擎里的,所以还是会需要动态的绑定一些内容,至于v_table可以通过一些其他的手段来避免page-switching,剩下的indirect call实质上带来效率的下降是非常少的.

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-12-14 15:30:00 | 显示全部楼层

Re:多态还是模板特化

google:
Particle System A Technique for Modeling a Class of Fuzzy Objects
Particle Animation and Rendering Using Data Parallel Computation
The design of the Particle System API
Building an Advanced Particle System
Physical based modeling


http://www.cs.unc.edu/~davemc/Particle/

空间、时间、复杂度、可持续维护性
得与舍的拿捏就是大智慧

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2006-12-14 16:40:00 | 显示全部楼层

Re:多态还是模板特化

用模板就是可读性和可维护性差

效率并不是一切,要根据需求进行平衡

新老程序员的差别就在这里

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-12-14 19:37:00 | 显示全部楼层

Re:多态还是模板特化

楼上说的有道理啊。

8

主题

98

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2006-12-14 21:25:00 | 显示全部楼层

Re:多态还是模板特化

典型的丢了西瓜,捡了芝麻,,,,要不要考虑用纯c写啊,。。。。好钢用在20%的核心代码就ok了

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-12-15 14:17:00 | 显示全部楼层

Re:多态还是模板特化

灵活性和性能之性的平衡…用哪种都无所谓…
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 02:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表