如何抓住ECS的命门,让我们的学习事半功倍
导读
这是一篇老文写与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的命门,让我们的学习事半功倍的更多相关文章
- 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucec ...
- 20165223 《JAVA程序设计》第六周学习总结
教材学习内容总结 第八章-常用实用类-要点 基础:String类 重点:StringTokenizer类,Scanner类 难点:Class类与Console类,Pattern类与Match类 其他特 ...
- Mudo C++网络库第十一章学习笔记
反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...
- 【Spark调优】Shuffle原理理解与参数调优
[生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashSh ...
- “IT学子成长指导”专栏及文章目录 —贺利坚
迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...
- 《IT小小鸟》读后感
我是来自大一的小小鸟,想要飞却没有一对坚硬的臂膀! 看了<IT小小鸟>了解了学长和学姐们的大学经历后开始让我反思我的大学生活.学长和学姐们通过自身的经历来告诉我们,应该怎么样规划好大学生涯 ...
- qconbeijing2017
http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日) 签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...
- 学习C语言,困难吗?
要说计算机如今什么最火.无异于网络.看看各大计算机站点,满眼尽是网络project师,什么IP啊,路由啊,虚拟机啊,总之,操作性的计算机技能牢牢占领了半壁江山. 这些技巧当然重要.可是 ...
- Rabbit安装(单机及集群,阿里云)
Rabbit安装(单机及集群,阿里云) 前言 虽然我并不是部署人员,但是自己私人测试环境的各类东东还是得自己安装的. 尤其在规模不大的公司,基本安装部署工作都是后端的份内之事. 那么最令人痛苦的,莫过 ...
随机推荐
- google Guava包的reflection(反射)解析
译者:万天慧(武祖) 由于类型擦除,你不能够在运行时传递泛型类对象——你可能想强制转换它们,并假装这些对象是有泛型的,但实际上它们没有. 举个例子: ArrayList<String> s ...
- 011_GoldWave软件安装及使用
(一)软件安装包: 链接:https://pan.baidu.com/s/15c5veooyA8bAYIAgLFOLjg提取码:jiis 复制这段内容后打开百度网盘手机App,操作更方便哦 (二)降低 ...
- Jquery检验输入值
1.检验邮件 function chkEmail(strEmail) { if (!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w ...
- Centos 如何扩充/增加磁盘
1:使用背景 废话不多说,磁盘空间不足,增加磁盘,然后扩充现有不足空间磁盘. 本次以Vmware进行测验. 2:我们本次要增加的就是这个 3:我们先添加一个磁盘,20G,添加过程不在赘述 4:添加完成 ...
- php 多维数组,根据某个特定字段过滤重复值
//假如 数据是这样的$arr=[ [ 'goods_name'=>'xxx', 'goods_id'=>111,],[ 'goods_name'=>'xxx', 'goods_id ...
- 数据结构实验之图论四:迷宫探索【dfs 求路径】
分析:起点已知,开个数组来存放路径,注意 vis 数组要初始化!另外,不能忘记了题目还要求回去的路径,只要在 dfs 之后加上就可以了. #include <bits/stdc++.h> ...
- Intellij IDEA常用配置记录
换个IDE试试. 一个地址 http://intellij.mandroid.cn/ http://idea.imsxm.com/ http://idea.iteblog.com/key.php TO ...
- 在win10环境下配置spark和scala
在这里配置的是在命令行下运行spark的环境用来学习,最后结果如下,可运行简单的代码. 0.jdk.scala和spark的版本问题 有关版本如官网所示,我想要强调的是spark至今并不支持jdk11 ...
- elasticsearch配置jdk
编辑bin/elasticsearch 可以看到elasticsearch使用环境变量JAVA_HOME中配置的jdk:if [ -x "$JAVA_HOME/bin/java" ...
- RK3288 修改ddr频率
转载请注明出处:https://www.cnblogs.com/lialong1st/p/10912334.html CPU:RK3288 系统:Android 5.1 RK3288 的 ddr 频率 ...