ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-04 21:04:34  阅读:251  来源: 互联网

标签:Versions 版本号 Chunk 实体 ECS 数组 组件 EntityId 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有