如何抓住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安装(单机及集群,阿里云) 前言 虽然我并不是部署人员,但是自己私人测试环境的各类东东还是得自己安装的. 尤其在规模不大的公司,基本安装部署工作都是后端的份内之事. 那么最令人痛苦的,莫过 ...
随机推荐
- Spring核心概念和案例
一.Spring概念 1.Spring框架概述 轻量级的Java EE开源框架,它是由Rod Johnson为了解决企业应用程序开发的复杂性而创建, Spring框架提供了一个开发平台,用于整合其他技 ...
- 33、[源码]-AOP原理-获取拦截器链-MethodInterceptor
33.[源码]-AOP原理-获取拦截器链-MethodInterceptor
- 简述 CGI、FastCGI和php-FPM的区别
1.CGI是联系webserver 跟php解析器的一个桥梁 2.FastCGI是CGI改良的版本 3.php-FPM 是FastCGI 的进程管理器
- C++标准库分析总结(三)——<迭代器设计原则>
本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...
- 关于$internalField边界条件【翻译】
翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-pre-processing/122386-about-internalfi ...
- php语言查询Mysql数据库内容
通过php语言实现对Mysql数据库的基本操作 1.php页面在进行浏览时需要有php语言执行的环境,本人用的是WampServer软件,只要将项目复制到wampserver_php\wamp\www ...
- Alpha项目冲刺! Day4-产出
各个成员今日完成的任务 林恩:任务分工,博客撰写,了解安卓环境搭建 杨长元:安卓本地数据库基本建立 李震:学习 胡彤:完善服务端 寇永明:学习 王浩:学习 李杰:学习 各个成员遇到的问题 林恩:为自己 ...
- web-msg-sender的https支持改造
用的是nginx代理转发443到2120端口实现,官方说workman原生支持,没有实现(现象是 访问 htttps://域名:2120/ 超时,不知道是服务器问题还是什么) 后转为用nginx代理转 ...
- Java 中的JSON 字符串
类库选择 Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库. 下面是几个常用的 JSON 解析类库: Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿 ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_18-身份校验-测试
在顶级域名下配置 网关的地址在上面配置一下 重启nginx 拒绝访问后面的代码都加上 return null 开始测试 换成域名的方式访问 有cookie.但是拿不到header 加上header测试 ...