如何抓住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安装(单机及集群,阿里云) 前言 虽然我并不是部署人员,但是自己私人测试环境的各类东东还是得自己安装的. 尤其在规模不大的公司,基本安装部署工作都是后端的份内之事. 那么最令人痛苦的,莫过 ...
随机推荐
- 安装部署mongodb
准备 groupadd mongodb useradd -g mongodb mongodb echo password |passwd --stdin mongodb mkdir -pv /data ...
- SpringBoot监控中心
1.什么是SpringBoot监控中心? 2.为什么要使用SpringBoot监控中心?
- zabbix(9)iterms(监控项)
一.iterms key 监控项按参数来分有两种:带参数和不带参 按定义来分:zabbix自带和用户自定义 1)Key可以带参数,该参数为一个数组列表,可以同时传递多个参数,Key的格式如下: 既Ke ...
- Python性能监控
profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和pstats.这些分析器提 ...
- 【原】Python基础-异常
def cacls(x, y): try: return x/y except ZeroDivisionError: print("y can not be zerp") exce ...
- HbuilderX
HBuilderX入门教程 HX是轻量编辑器和强大IDE的完美结合体.敏捷的性能,清爽的界面,强大的功能和于一身. 本文档面向入门用户,建议初学者仔细研读. 介绍 执着于更快一步的理念,hx的左侧项目 ...
- [Linux] pwm设备驱动调试
转载请注明出处:https://www.cnblogs.com/lialong1st/p/11436190.html CPU:RK3288 系统:Linux 客户需求是通过 pwm 控制激光的强弱,写 ...
- idea JRebel
JRebel 链接:https://pan.baidu.com/s/11LI0RkPtrfEWQENns6cWAA 提取码:ndsu settings -> plugins -> inst ...
- EL表达式 与 JSTL标准标签库
目录 EL表达式 什么是EL表达式 作用 EL内置11对象 EL执行表达式 JSTL 什么是JSTL JSTL标准标签库有5个子库 把JSTL标签库jar包引入工程当中 if标签 foreach标签 ...
- html5、手机端 input 单独打开相机、摄像头、录音功能
相机:<input type="file" name="image" accept="image/*" capture="u ...