ECS框架文档翻译十九 Versions and Generations

版本号

概述

设置版本号(又称代)是为了检验潜在的变化。 除此之外,它们可用于实现廉价且高效的优化策略,例如, 当发现被操作的数据自上一帧以来已经被确认没有改变时,这些操作处理可能可以被跳过。

通常情况下,通过对实体块执行一次性的非常快速的保守版本检查,可以轻松获得显著的性能提升。

此页面列出并说明了ECS中使用的所有不同的版本号,重点解释了导致它们更改的条件。

初步印象

所有版本号都是32位有符号整数,它们总是增加的,除非它们溢出环绕,有符号整数溢出是在C#中定义的行为{译者注:也就是说溢出时也可以正常比较【?】}。 这意味着比较版本号应该使用(in)相等运算符,而不是关系运算符。

检查VersionB是否比VersionA更新的正确方法是:bool VersionBIsMoreRecent =(VersionB -  VersionA)> 0;

通常不保证版本号的具体增加量。

EntityId.Version

EntityId由索引(index)和版本号组成。 由于所有的索引都是循环使用的,因此每次销毁实体时,它的版本号都会在EntityManager中被增加。 如果在EntityManager中查找EntityId时,若发现版本号不匹配,则表示所引用的实体已经不再存在。

在获取敌人的位置(通过EntityId进行跟踪敌人)之前,您可以调用ComponentDataFromEntity.Exists 使用版本号来检查敌人实体是否仍然存在。

World.Version

每当创建或销毁管理器(即系统)时,World的版本号都会增加。

EntityDataManager.GlobalVersion

在每个(job)系统更新之前增加。

此版本号的目的是与System.LastSystemVersion一起使用。

System.LastSystemVersion

每次(作业)组件系统更新后,获取EntityDataManager.GlobalVersion的值来作为当前值。

此版本号的目的是与Chunk.ChangeVersion 数组一起使用。

Chunk.ChangeVersion数组

对于原型中的每个组件类型,此数组包含上次访问组件数组时EntityDataManager.GlobalVersion的值,该值在此块中可写。 这不能保证确实有改变发生,只是它可能已经发生了变化。

共享组件永远不能被以写入的形式访问,即使技术上也存储了版本号,它也没有用处。

当在IJobForEach中使用[ChangedFilter] 属性时, 指定组件的 Chunk.ChangeVersion将会被 System.LastSystemVersion进行比较,因此,只有这样的Chunk才会被处理----它们的组件数组中,自从上次系统运行以来来已经被进行过写入访问

如果一整组单位的健康点数自上一帧以来都能保证没有变化,则可以完全跳过检查这些单位是否应更新其损坏模型的环节。

EntityManager.m_ComponentTypeOrderVersion[]

对于每个非共享组件类型,每次涉及该类型的遍历访问结束时,版本号会增加。 换句话说,任何可能修改该类型的数组(不是实例)的东西。

如果我们有由特定组件和每个块级别的边界框标识的静态对象,我们知道如果该组件的类型顺序版本发生更改,我们只需要更新这些边界框。

SharedComponentDataManager.m_SharedComponentVersion[]

当包含该共享组件的块中的实体发生任何结构级的更改时,这些版本号会增加。

想象一下,我们想保留每个共享组件的实体数量,如果相应的版本号发生变化,我们可以依赖该版本号来重做每个计数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值