导读

这是一篇老文写与2019年5月

我们说如何提高我们的学习效率,有人说一本书一般只会讲一个知识点,那我们学习ECS 如何抓住学习的重点,提高学习效率。经过本人一段时间的学习总结,总于找到了一个便捷的方法。当然如果只是入门,完全可以绕道,不用看这篇文章了,因为入门的教程unity3d的document以及sample中已经覆盖了。我们要解决的问题不是如何使用ECS ,而是为什么要这么用,内在原因以及unity3d 为何要这么设计。在开始之前我们还是按照老习惯抛出几个问题
1、ECS的数据组件类型有那些?
2、他们的区别是什么,都用于什么场景?
3、这些数据类型都是怎么获取的(access)的,或者说IComponentData 都是怎么获取的
4、EntityQuery 进行数据查询是如何实现的
5、如何优化和设计ECS系统的性能

1,2问题我们发现基本是概念的问题,但是3,4 问题摆在你的面前,你会发现使用我们学习的基础入门知识,我们是解释不了得,如果我们没有理论知识作为支撑,我们无法理解这些问题的本质,无法让我们在ECS学习的路上走的更远更深入。
      言归正传,我们进入本系列的主题,我们知道ECS是基于一种基于面向数据的开发模式,最主要的特点是数据的线性连续存放。我想看这篇文章的同学,也有一定ECS的基础知识了,应该耳熟能详了。我们换个思路来想想,光知道这句话的实际意义又是什么呢,只是一个概念而已,就像我们中国的it人要开发自己的操作系统,我们在大学里面已经学习了“操作系统原理”这们课程,但是为什么我们弄了这么多年也没有开发出操作系统呢? 当你真正的进入unity ecs的开发你会发现一个问题,我们光知道这个数据连续存放的概念,并不能帮助我们深入学习ecs,也不能帮我们回答以上提出的几个深入的问题,更谈不上让我们游刃有余的在实际项目中应用ecs了。最后呢,才能引出我们本篇的主题 ”unity ecs的数据存储结构到底是什么样子的呢?“
这个问题又能分成好几个子的主题来说明,本篇,解决的第一个问题是 Normal IComponentData 也就是最简单的数据组件是如何存储的ECS进行数据存储的物理单位是chunk,而逻辑单位是ComponentData,所以要搞明白本章主题我们又要回答以下几个问题
1、什么事chunk
2、chunk的数据结构式什么样的
3、chunk与ComponentData的组织关系式是什么?

1、什么是chunk chunk是ECS进行内存存储的单元,具有固定的大小,目前是什么16kb(将来可能进行调节),其中包含的内容有EnityArchetype,EnityIndex ComponentData 和SharecomponentData。分为两种情况,如果entity 实体只包含IcomponentData 普通数据那么,一种实体对象数组对应(1,n)个chunk
chunk的结构是,chunk头,数据区和sharedata区 。其中数据去IComponentData的存储方式是按component type 分组进行分组进行排列。
2、ShareComponent 的保存比较特殊
a、如果实体只有一个Sharecomponent数据,或者多个,他们保存在component的数据区后面,保存的是指向真正数据的指针
b、sharecomponent value 与chunk 是 oen pre chunk的关系,也就是一种sharecomponent value 保存在一个chunk中,举例就是,student 实体,其中保存‘男’的实体数组在一个chunk中,保存‘女’的实体的数组在另一个chunk中,所以应用这个特性我们可以通过查询sharecomponent 的具体value (data)来过滤 chunk,提供组件access的速度
c、tag component的存储,由于其实不包含任何实质的数据,其实只具有entityarchetype,那么我们知道 entiy 与chunk 是1对多的关系,也就是 如果知道entity的具体archeype(componnet type的组成)也就知道了enity,知道了entity也就知道了它所占用的chunk,所以同过tag component 可以方便的进行具有多种componenttype 数据的筛选和过滤

以上内容只是个人的一个终结,需要学习一定程度后才能正真领会,大家加油。

如何抓住ECS的命门,让我们的学习事半功倍的更多相关文章

  1. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucec ...

  2. 20165223 《JAVA程序设计》第六周学习总结

    教材学习内容总结 第八章-常用实用类-要点 基础:String类 重点:StringTokenizer类,Scanner类 难点:Class类与Console类,Pattern类与Match类 其他特 ...

  3. Mudo C++网络库第十一章学习笔记

    反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...

  4. 【Spark调优】Shuffle原理理解与参数调优

    [生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashSh ...

  5. “IT学子成长指导”专栏及文章目录 —贺利坚

    迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...

  6. 《IT小小鸟》读后感

    我是来自大一的小小鸟,想要飞却没有一对坚硬的臂膀! 看了<IT小小鸟>了解了学长和学姐们的大学经历后开始让我反思我的大学生活.学长和学姐们通过自身的经历来告诉我们,应该怎么样规划好大学生涯 ...

  7. qconbeijing2017

    http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日)   签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...

  8. 学习C语言,困难吗?

            要说计算机如今什么最火.无异于网络.看看各大计算机站点,满眼尽是网络project师,什么IP啊,路由啊,虚拟机啊,总之,操作性的计算机技能牢牢占领了半壁江山. 这些技巧当然重要.可是 ...

  9. Rabbit安装(单机及集群,阿里云)

    Rabbit安装(单机及集群,阿里云) 前言 虽然我并不是部署人员,但是自己私人测试环境的各类东东还是得自己安装的. 尤其在规模不大的公司,基本安装部署工作都是后端的份内之事. 那么最令人痛苦的,莫过 ...

随机推荐

  1. Centos 改ssh 端口

    1.修改配置文件:/etc/ssh/sshd_config 2.修改 #Port 22 把前面的#注释删掉,然后添加一个Port XXXX 定义一个自己的.例如我喜欢 Port 22333 3.修改后 ...

  2. iOS入门及ObjC语法

    iOS入门:http://www.jonathanhui.com/ios ObjC语法: http://www.jonathanhui.com/objective-c https://github.c ...

  3. java重载和重写

    重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. ...

  4. 关于item的prevvalue

    一个数据库大小监控项的更新周期是86400.一天,使用的最新值减去上次数值来显示变化值,一直就是10g-0 变化值为10g. 在更新时间为一天的时候prevvalue是0,不能显示上次的数值 当吧更新 ...

  5. splay树 1285 宠物收养所

    #include<cstdio> #include<iostream> using namespace std; int shu[80004][2],n,size,root,k ...

  6. 【原创】go语言学习(七)数组

    目录 数组定义 二维数组 数组拷贝.传参 数组定义 1. 数组是同一类型的元素集合. var a [3]int //定义一个数组 //Go中数组下标从0开始,因此⻓长度为n的数组下标范围:[0,n-1 ...

  7. 二分算法题目训练(三)——Anton and Making Potions详解

    codeforces734C——Anton and Making Potions详解 Anton and Making Potions 题目描述(google翻译) 安东正在玩一个非常有趣的电脑游戏, ...

  8. 第九届蓝桥杯(A组填空题)

    1.标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …. 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似: 3/2 当然,这只是加了前2项 ...

  9. hbase单点安装

    系统环境:centos 6 软件包: hbase版本:hbase-1.4.8-bin.tar.gz     下载地址:wget  http://mirror.bit.edu.cn/apache/hba ...

  10. Arts打卡第5周

    Algorithm.主要是为了编程训练和学习. 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard). 进行编程训练,如果不训练你看再多的算法书,你依然不 ...