当我编码游戏玩法时,如何应用面向数据的范例

本文关键字:应用 范例 数据 何应用 游戏 编码 玩法 | 更新日期: 2023-09-27 18:17:20

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

我读了很多关于国防部的文章,每篇文章都谈到了如何应用国防部,为什么要应用国防部,并解释说国防部不是解决所有问题的灵丹妙药…

但我在问自己:当我想要编写游戏玩法时,当我想要编写所有内容时,如果可以应用这种心态,它可以提供什么,这种心态可以限制我到什么程度,那会怎么样?

本周我谈到一个游戏功能和我的老师,和他解释我国防部心态基本上是数据和函数,每一个数据都是宇宙,每个函数是一种宇宙从一个到另一个(这个比喻似乎可以奇怪的但它听起来不错,当你有一个动画所有的宇宙中每个位置的骨架时间表,使它们之间过渡的方法是应用一个宽松函数)。

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

当我编码游戏玩法时,如何应用面向数据的范例

数组结构(AOS),可能导致缓存丢失,particlessystem非常适合DOD(面向数据),即AOS向SOA的转换。

原系统为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;
};

每次particlessystem更新时,不是所有的属性更新,而是所有的单个属性更新。

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