有一直对什么样的数据化的设计是一个问题和有一个物品,其通常被称为(我已经像5或6次阅读已经)。我理解的这个一般概念,特别是与打交道时,例如,3D模型,您希望把所有顶点在一起,而不是与法线污染你的脸,等等。

不过,我有一个困难时期如何可视化数据化的设计可能适用于任何东西,但最简单的情形(3D模型,颗粒,BSP树,等等)。有没有什么好的例子在那里这实际上包含了面向数据的设计,并展示了如何在实践中,这可能会奏效?如果需要的话,我可以通过大的代码碱基犁。

什么我尤其感兴趣的是“有很多,其中有一个”口头禅,我真的不能似乎与其他连接在这里。是的,总有一个以上的敌人,但是,你仍然需要单独更新每个敌人,因为他们是不动以同样的方式,现在是什么人?这同样适用于在接受的答案上述问题的“balls',例如(其实我问这个到这个问题的答案评论,但还没有得到答复还)。难道仅仅是渲染只需要的位置,而不是速度,而游戏模拟既需要,而不是材料?还是我失去了一些东西?也许我已经了解它,它比我想象一个更为简单的概念。

任何指针将不胜感激!

有帮助吗?

解决方案

那么,什么是国防部一回事呢?显然,这是关于性能,但它不只是这一点。这也是有关精心设计的代码,可读性强,易于理解,甚至可重复使用。 现在,面向对象的设计是所有关于设计的代码和数据,以适应封装虚拟的“对象”。每个对象都是一个单独的实体与性质变量对象可能有和方法采取行动本身或其它物体在世界上。 OO设计的优点是,它很容易在你的代码精神上模型为对象,因为我们周围的整个(真实)世界似乎以同样的方式工作。对象与可以彼此交互属性。

现在的问题是,在你的电脑CPU中的一个完全不同的方式工作。当你让它一次又一次地做同样的事情它的工作原理最好的。这是为什么?因为一个小东西叫做缓存。现代计算机上访问RAM可以利用100个或200的CPU周期(与CPU必须等待所有的时间!),这是太长了。因此,有内存,可真的很快访问的CPU,高速缓冲存储器在这小部分。问题是,它只有几MB上衣。所以每次你需要的是不在缓存中的数据的时候,你仍然需要很长的路去RAM。这不仅仅是因为这样的数据,同样也适用于代码。而码从RAM加载试图执行的功能,这不是在指令高速缓冲存储器将导致失速。

回到OO编程。对象是大,但大多数功能只需要该数据的一小部分,通过加载不必要的数据,所以我们浪费缓存。方法调用其它方法调用其他方法,颠簸你的指令缓存。尽管如此,我们经常做很多同样的东西一遍又一遍。让我们从子弹例如游戏。在一个天真的实现每一颗子弹可能是一个单独的对象。有可能是一颗子弹管理器类。它调用第一颗子弹的更新功能。它更新使用方向/速度的3D位置。这将导致大量的从物体的其他数据的被加载到高速缓存中。接下来,我们称之为世界经理类检查与其他物体碰撞。这种负载很多其他的东西到缓存中,也许它甚至会导致从原来的子弹管理器类代码从指令缓存下降。现在我们回到子弹更新,没有冲突,所以我们回到子弹经理。它可能需要重新加载一些代码。接下来,子弹#2更新。此负载大量的数据到缓存中,调用世界......等,所以在这种情况下hypthetical,我们已经有了2个摊位加载代码和假设2个摊位加载数据。这是至少400个循环浪费,为1发子弹,我们也没有采取打别的东西进去的子弹。现在,在3+ GHz的CPU一跑,所以我们不打算通知一发子弹,但是如果我们有100发子弹?甚至更多?

因此,这是那里的一个有很多故事。是的,有一些情况下,你只有在对象,你的管理类,文件访问等,但更多的时候,有很多类似的案例。天真的,甚至不是天真的面向对象的设计会导致很多问题。所以,进入数据化的设计。国防部的关键是你的代码在你的数据,而不是周围的其他方法与面向对象的设计模型。这将启动在设计的最初阶段。你不首先设计您的面向对象的代码,然后对其进行优化。您可以通过列表和检查数据,并跳出思维要如何修改它(我会得到一个实际的例子在某一时刻)开始。一旦你知道你的代码是如何去修改数据,你可以在一定程度上使得它尽可能高效处理它摊开来。现在,你可能会认为这只能导致的代码和数据无处不在一个可怕的汤但这只是如果你不好设计它(糟糕的设计也很容易用面向对象编程)的情况。如果设计得很好,代码和数据可以被整齐地围绕着特定函数的设计nality,导致非常可读甚至非常可重用代码。

那么回到我们的子弹。而不是创建每个子弹一类的,我们只保留子弹经理。每颗子弹都有一个位置和速度。每个子弹的位置需要更新。每一颗子弹必须有一个碰撞检测,并有碰到什么东西需要相应地采取一些行动的所有子弹。因此,只要通过这个描述考虑看看我能在一个更好的方法设计这个整个系统。让我们把所有的子弹的位置在一个数组/向量。让我们把所有的子弹的速度在阵列/矢量。现在,让我们通过迭代allong这两个阵列和与它的相应的速度更新每个位置值开始。现在,加载到数据缓存中的所有数据是我们将要使用的数据。我们甚至可以把一个智能预加载命令已经使数据在缓存中,当我们把它提前预加载一些阵列的数据。接下来,碰撞检查。我不打算进入细节,但是你能想象有彼此可以帮助后更新所有的子弹。还要注意的是,如果有冲突,我们不会调用一个新的功能或做任何事情。我们只是保持与有碰撞和碰撞时,检查完成后,我们就可以更新后,对方所有的一切子弹的向量。看看我们刚刚从大量的内存访问去了,几乎没有通过不同的铺设我们的数据呢?您是否也注意到我们的代码和数据,即使没有任何更多的面向对象的方式设计,怎么还在容易理解和容易重用?

所以,要回了“哪里有一个有很多”。在设计面向对象的代码,你想想一个对象,原型/班。子弹的速度是,子弹有一个位置,子弹会被它的速度移动每一帧,子弹可以碰到了什么东西,等等。当你想到这一点,你想想一类,具有速度,位置,以及其移动碰撞的子弹,并检查更新功能。然而,当你有多个对象,你需要考虑所有的人。子弹有位置,速度。一些子弹可能有冲突。你看我们怎么不考虑单个对象不再?我们即将所有的人的思维和很多不同的现在设计的代码。

我希望这有助于回答你的问题的第二部分。这不是你是否需要更新每个敌人与否,它是关于最有效的方式对其进行更新。而在设计使用国防部可能无法帮助增益太大的业绩只有你的敌人,设计围绕这些原则(仅适用!)整个游戏可能会导致大量的性能提升!

所以到问题的第一部分,即DOD的其他例子。我很抱歉,但我没有那么多有。有一个真的很好的例子,虽然,我碰到这个前一段时间来,由比约恩·Knafla定向的行为树的设计数据系列:的 http://bjoernknafla.com/data-oriented-behavior-tree-overview 你可能想在系列4的第一个启动,链接是在文章本身。 希望这有助于依然,尽管这个老问题。或者一些其他SO用户遇到这个问题,并没有从这场答案有些用处。

其他提示

我看了您链接到的问题和文章。

我上驱动数据的主体阅读一本书的设计。

我在同一条船上几乎你。

我明白诺埃尔的文章的方式是你设计自己的游戏在典型的面向对象的方式。你有类和方法上的类的工作。

你做你的设计之后,你会问自己以下问题:

如何安排所有我设计了一个巨大的BLOB数据的?

在写你的整个设计作为一个功能性的方法,有很多下属方法的角度来考虑它。这让我想起我的青春的大规模500000个Cobol程序的我。

现在,你可能不会写整个游戏作为一个巨大的功能性方法。说真的,在文章中,诺埃尔在谈论游戏的渲染部分。把它看成是一个游戏引擎(一个巨大官能法),以驱动所述游戏引擎(OOP代码)的代码。

  

什么我尤其感兴趣的是“有很多,其中有一个”口头禅,我真的不能似乎与其他连接在这里。是的,总有一个以上的敌人,但是,你仍然需要单独更新每个敌人,因为他们是不动以同样的方式,现在是他们?

您正在考虑从对象的角度。尝试在功能性方面的思想。

每个敌人更新是一个循环的迭代。

最重要的是,敌人数据的结构是在一个内存位置,而不是分布在敌人的对象实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top