其他分享
首页 > 其他分享> > ECS框架文档翻译十九 Versions and Generations

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[]

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

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

标签:Versions,版本号,Chunk,实体,ECS,数组,组件,EntityId,Generations
来源: https://blog.csdn.net/AndrewFan/article/details/90666092