当我编码游戏玩法时,如何应用面向数据的范例
本文关键字:应用 范例 数据 何应用 游戏 编码 玩法 | 更新日期: 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;
....
....