在我编写游戏玩法时如何应用面向数据的范例

时间:2015-10-11 14:28:06

标签: c# unityscript

我目前正在考虑如何应用面向对象设计而不是面向对象设计。

我读过很多关于国防部的文章,他们每个人都谈到了如何申请国防部,为什么申请国防部,解释国防部不是反对所有问题的银弹......

但我问自己:如果有可能在我想要编写游戏玩法时应用这种思维方式,当我想编写所有内容,它可以提供什么,以及这种思维模式可能限制我的范围时,该怎么办?

本周我与老师讨论了一个游戏功能,他向我解释说,DOD心态基本上是数据和功能,每个数据都是宇宙,每个功能都是从宇宙到另一个的一种方式(这个隐喻似乎很奇怪,但听起来不错,当你有一个动画时,所有宇宙都是时间轴中骨架的每个位置,在它们之间进行过渡的方法是应用缓动函数。)

我真的不知道如何应用它,如果尝试应用面向对象设计而不是面向对象设计,我会失去什么,你有一个具体的代码示例来解释我如何应用它吗?

2 个答案:

答案 0 :(得分:0)

Array Of Struct(AOS),可能导致缓存未命中,ParticleSystem非常适合DOD(面向数据),即AOS ronvert to SOA。

答案 1 :(得分:0)

原始系统是AOS,结构是:

class TextureParticle
{
public:
    friend class TextureParticleEmitter;
public:
Vector3     mPosition;
Vector3     mLastPosition;
Vector3     mVelocity;
Vector2     mUVOffset;
Color       mColor;
Color       mBaseColor;
Float       mRandom;
Float       mScale;
Float       mBaseScale;
Float       mRotate;
};
TextureParticle particles[PARTILCE_COUNT];

更新

for(int i = 0 ; i < PARTICLE_COUNT; i++)
updateParticle(particles[i]);

将AOS转换为SOA时,结构为:

class TextureParticles
{
public:
    float*          mRemainLife;
    Vector3*            mPosition;
Vector3*            mVelocity;
Vector2*            mUVOffset;
Color*              mColor;
Float*              mRandom;
Float*              mScale;
Float*              mRotate;
};

每次粒子系统更新时,不是所有属性更新,而是所有属性中的单个属性。

for(int i = 0 ; i < ParticleCount ; ++i)
    UpdatePositions;
for(int i = 0 ; i < ParticleCount ; ++i)
    UpdateVelocity;
  ....
  ....