重复使用对象实例和每次交换缓冲区时创建新实例之间的差异和陷阱是什么?
背景:
这是我的一个游戏引擎项目。
我正在编写一个TripleBuffer,在其中我有每个对象的三个版本:旧版本、当前版本和未来版本。通过从当前版本读取状态并对未来版本应用更改来对这些对象进行更改。在对所有对象进行更改后(如适用),将交换缓冲区:未来对象变为当前对象,当前对象变为旧对象,旧对象要么被放弃并通过迭代当前对象来分配新对象,要么成为现在的未来对象,并通过迭代当前对象更新(或覆盖)它们的值。
解释:
“重复使用”:用新值覆盖旧实例的值,有效地改变实例的状态
“新建/克隆”:使用旧实例的数据创建一个新实例,并对其进行更改
用例:
假设有1000个对象以30Hz交换,这意味着它们需要每秒重新创建30次,方法是克隆现在的当前对象或重用现在过时的上一个旧对象(覆盖它们的所有状态)。
它们的复杂性可以从5个属性到数百个属性不等,并且始终具有至少2级深度。
(至少2级深度=缓冲对象本身仅包含构成它们的其他唯一对象的映射)
重新创建和重复使用都需要迭代当前对象及其组件(短于:依次组成它们的对象)。
进一步考虑:
在引擎的其他部分中,将有事件触发和其他魔法,这些事件将使用对象的即时快照进行工作。因此,重新创建或重复使用的决定将导致以下情况之一:
重新创建意味着我可以安全地传递对象的引用,因为该对象将在成为“当前对象”时变为不可变。
重复使用意味着我必须创建当前对象或我进一步需要的任何部分的副本,因为我不能保证事件(或其他)将在对象被重复使用之前处理
背景:
这是我的一个游戏引擎项目。
我正在编写一个TripleBuffer,在其中我有每个对象的三个版本:旧版本、当前版本和未来版本。通过从当前版本读取状态并对未来版本应用更改来对这些对象进行更改。在对所有对象进行更改后(如适用),将交换缓冲区:未来对象变为当前对象,当前对象变为旧对象,旧对象要么被放弃并通过迭代当前对象来分配新对象,要么成为现在的未来对象,并通过迭代当前对象更新(或覆盖)它们的值。
解释:
“重复使用”:用新值覆盖旧实例的值,有效地改变实例的状态
“新建/克隆”:使用旧实例的数据创建一个新实例,并对其进行更改
用例:
假设有1000个对象以30Hz交换,这意味着它们需要每秒重新创建30次,方法是克隆现在的当前对象或重用现在过时的上一个旧对象(覆盖它们的所有状态)。
它们的复杂性可以从5个属性到数百个属性不等,并且始终具有至少2级深度。
(至少2级深度=缓冲对象本身仅包含构成它们的其他唯一对象的映射)
重新创建和重复使用都需要迭代当前对象及其组件(短于:依次组成它们的对象)。
进一步考虑:
在引擎的其他部分中,将有事件触发和其他魔法,这些事件将使用对象的即时快照进行工作。因此,重新创建或重复使用的决定将导致以下情况之一:
重新创建意味着我可以安全地传递对象的引用,因为该对象将在成为“当前对象”时变为不可变。
重复使用意味着我必须创建当前对象或我进一步需要的任何部分的副本,因为我不能保证事件(或其他)将在对象被重复使用之前处理