本文共 2617 字,大约阅读时间需要 8 分钟。
今天跟同学们分享一下我找到的关于ECS相关的理论知识文章,可能比较枯燥,如果想看实操的请看我下方写的一些案例解析。
什么是CPU缓存???
为什么需要CPU多级缓存:
CPU多级缓存预先存的是什么:
CPU缓存命中/未命中:
提高CPU缓存命中率
冷数据/热数据分割
有人可能认为这样能最大程度利用CPU缓存:把一个对象所有要用的数据(包括组件数据)都塞进一个类里,而没有任何用指针或引用的形式间接存储数据。
实际上这个想法是错误的,我们不能忽视一个问题:CPU缓存的存储空间是有限的 于是我们希望CPU缓存存储的是经常使用的数据,而不是那些少用的数据。这就引入了冷数据/热数据分割的概念了。
热数据:经常要操作使用的数据,我们一般可以直接作为可直接访问的成员变量。
冷数据:比较少用的数据,我们一般以引用/指针来间接访问(即存储的是指针或者引用)。
oop模式的主要的思想就是万物皆对象,调用的方式几乎都是以对象为基础,以模块化编程的带来优势的同时,也有他的负面效果:冗余数据过多,包袱过重。举个例子:在旅行时是一个人带一张信用卡去还是带一堆的生活用品去会更方便呢?答案当然是前者,只需要带着有用的东西就可以了,无用的都可以丢掉。oop其实也是这个样子,在进行数据传输的时候(数据读取)总会带着一些无用的数据,不仅仅零零散散(传统方式的内存管理是离散式的),而且还占用空间(上文提到的CPU多级缓存),随着现在游戏的规模越来越大,摩尔定律的失效,单纯的提高主频达到好的计算效果变得越来越力不从心。
传统方式的内存管理是离散式的,即物体和它的组件(Component)并非在同一个内存区段,每次存取都非常耗时。而ECS会确保遍历时所有的组件资料(Component Data)都紧密的连接再一起,称为Archetype,这样就能确保存取内存资料时以最快的速度存取(也提高命中率)。
数据量身定制化,不会有多余的数据,例如Position原有的Vector3换成了现在Float3,列表等换成了unity重新定的Native开头的数据结构,分为并发和非并发执行。IJob、IJobParallelFor或 IJobParallelForTransform会根据是否单核还是多核分别选择接口,SharedComponentData和ComponentData等等。这种量身定制或数据也带来了更多的选择性和灵活性,随之通用性也就降低。
这种多核心并行计算也符合现在硬件的发展趋势,摩尔定律的失效,以增加核心数量带来的计算力不断的提升是现在主流的现象。
根据官方介绍,此项目包含450万网格渲染,5000辆动态汽车,10万种独特的声音效果,每栋建筑的零件达到20万个,并且还能以60fps的帧率稳定运行。另外,视频的结尾部分还公开了一段手机平台的演示,官方特别指出这绝不是使用手机播放了一段视频,而是真正用Unity生成APP,再在手机上运行的画面。这款demo和所有资源将于2019年发布。
转载地址:http://hxsfa.baihongyu.com/