【新手小白自我鞭策—补充部分专有名词】
缓存命中:缓存命中率:通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。
命中:可以直接通过缓存获取到需要的数据。
不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。
自己理解其他操作为选择下一级缓存,如果没有下一次缓存就访问内存?(不确定)
缓存抖动:缓存抖动 ,多处理器系统中若干缓存之间为了保证缓存一致性要直接通信,如果内存总线忙于其他缓存事务,需要通信的缓存就必须等待其他缓存通信(更新访问)之后才能通信,这种等待就是缓存抖动。
AOS和SOA: AOS即为结构的数组,SOA为数组的结构,例如:
struct AoSData
{
public int a;
public int b;
public int c;
public int d;
}
struct SoAData
{
public NativeArray<int> aArray;
public NativeArray<int> bArray;
public NativeArray<int> cArray;
public NativeArray<int> dArray;
}
两者在内存上的划分大致如下:
SOA相对于AOS的性能优化主要是现代计算的的Cache缓存策略,假设一次Cache可以加载4个数据,即可以加载abcd,那么对于AOS如果要取出这三个A,则需要三次Cache line,但对于SOA则只需要一次。
参考文章连接:https://developer.unity.cn/projects/61ff5161edbc2a001cf9856e
SIMD:即单指令流多数据流,是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。简单来说就是一个指令能够同时处理多个数据。
非托管内存块:系统不会自动回收的内存。
prefetch:预提取,告诉系统在下一次可能会用到的资源,系统会利用空闲时间去加载,并缓存,使用 prefetch 加载的资源,下一次调用该资源时则直接会从磁盘缓存中加载。
Archetypes: 拥有相同组件集合的Entities数组,例如Entity A和B都拥有Position,Rotation,Rigidbody组件,则AB都属于同一个Archetypes,Entity C拥有Position,Rotation组件,则它和AB属于不同的Archetypes。
chunk: 简单理解为为每一个Entity的组件集合分配固定的空间,大小为16K,不足16K的补齐,如下图:
参考视频:Unity中文课堂 《DOTS之路》章节1前导课3:https://learn.u3d.cn/tutorial/road-to-dots?chapterId=63562b25edca72001f21cff3#635fe0d3624a9e0020a5e4b9
World:Entity组合,每一个Entity在World中是唯一的(唯一标识),统一受EntityManager的管理。
EntityManager:创建,销毁,修改,更新Entity。
Structural Change:一切导致改变内存块的操作都叫Structural Change(以下是个人见解,有错误请大佬们提出!!!)
图1 原来的结构(红框忽略,为什么要忽略,我不知道Doge)
改变结构后的内存块
改变内容后的内存块:
避免频繁出现Structural Change,因为只能在主线程中运行,效率低,可以在编辑时进行Bake,虽然降低了逻辑灵活性,但提高了性能。
Query:暂时不做说明,后续跟随笔记更新。