我目前正在考虑如何应用面向对象设计而不是面向对象设计。
我读过很多关于国防部的文章,他们每个人都谈到了如何申请国防部,为什么申请国防部,解释国防部不是反对所有问题的银弹......
但我问自己:如果有可能在我想要编写游戏玩法时应用这种思维方式,当我想编写所有内容,它可以提供什么,以及这种思维模式可能限制我的范围时,该怎么办?
本周我与老师讨论了一个游戏功能,他向我解释说,DOD心态基本上是数据和功能,每个数据都是宇宙,每个功能都是从宇宙到另一个的一种方式(这个隐喻似乎很奇怪,但听起来不错,当你有一个动画时,所有宇宙都是时间轴中骨架的每个位置,在它们之间进行过渡的方法是应用缓动函数。)
我真的不知道如何应用它,如果尝试应用面向对象设计而不是面向对象设计,我会失去什么,你有一个具体的代码示例来解释我如何应用它吗?
答案 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;
....
....