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