每次更新都会重用对象实例与创建新实例

时间:2015-04-29 15:12:04

标签: java buffering

每次交换缓冲区时,重用对象实例与创建新实例之间有什么区别和缺陷?

背景:

这是我的游戏引擎项目。

我正在写一个 TripleBuffer ,其中我有三个版本的每个对象:旧版本当前版本未来版本。将通过从当前版本读取状态并将更改应用于将来的版本来对这些对象进行更改。在对所有对象进行了更改后(如果适用),缓冲区将交换:将来的对象成为当前对象,当前对象成为旧对象,旧对象?< / p>

  • 被丢弃,新的对象将通过迭代现在的当前对象来分配
  • 成为 now 以后的对象,通过迭代 now <更新(分别重写) / em>当前对象。

说明:

  • “reusing”:用新值覆盖旧实例的值,有效地改变实例的状态
  • “new ones / cloning”:使用旧实例的数据创建新实例,并对其应用更改

使用案例:

假设有一些1000个对象以30Hz交换,这意味着它们需要每秒重建30次,要么克隆现有的对象,要么重用现在过时的旧对象(覆盖其所有状态)。

它们的复杂程度可以从大约5个属性到数百个属性,并且深度至少为2级

至少2个级别的深度 =缓冲的对象本身只包含构成它们的其他唯一对象的地图)

重新创建和重用要求迭代当前对象及其组件(短于:对象反过来构成< / em>的)。

进一步考虑:

在引擎的其他部分,将会有事件触发和其他魔法,它们可以使用对象的及时快照。因此,重新创建或重用的决定将导致:

  • 重新创建意味着我可以安全地传递对该对象的引用,因为该对象在成为当前对象时将变为不可变
  • 重用意味着我必须创建当前对象的副本或其他我需要的部分的副本,因为我不能保证事件(或其他)将会在对象重用之前进行处理

1 个答案:

答案 0 :(得分:1)

在图形中使用缓冲区,以便在尝试更新时不会逐个像素地“绘制”到屏幕。相反,您绘制到缓冲区,然后您可以一次交换整个图像。

我认为你使用缓冲区有类似的原因。当您处理它们时,您不希望使用新更新的对象修改“当前”对象,因为它会破坏当前对象的“图像”。

重用的好处:

  • 您不会丢弃尽可能多的内存,需要更少的垃圾回收
  • 您只需要更新已更改的对象

重新创建的优势

  • 必须创建每个对象
  • 更简单,更清洁

您的最终决定将取决于性能与清晰度。重新创建所有对象有多贵?比较每个对象并仅构建所需的对象会更便宜吗?

即使比较对象或跟踪哪些内容发生变化更便宜,但为了更加简单起见,创建新内容的成本可能是值得的,这正是@DaphnaShezaf's answer所关注的。