导读

这是一篇老文写与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. Luogu P2148 [SDOI2009]E&D (sg函数 博弈)

    题目 洛谷传送门 题解 打表找sgsgsg规律. 严谨证明见:纳尔的博客 CODE #include <bits/stdc++.h> using namespace std; int sg ...

  2. Java处理小数点后几位

    //方式一: //四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); , BigDecimal.ROUND_HALF_UP). ...

  3. sql的九个常用语句是什么

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  4. Druid连接池 报错:abandon connection原因分析

    问题现象:使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Druid ...

  5. 数据库学习之七--视图(View)

    一.定义 视图:指计算机数据库中的一个临时虚拟表,其内容由查询定义:同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在. 二.优点 1. 优点: a. ...

  6. 一个简单的python实现百度登录操作

    conftest作为全局调用,用于登录之后的其他元素使用,且保持登录状态的操作 在开始前需要搭建好测试环境,环境包含python+webdriver+浏览器驱动(此处为firefox) 1.conft ...

  7. vue文件中提示Expected Boolean, got String

    这种情况是有一些属性的值应该填写Boolean类型,但是当前的值可能是“”--字符串 这种情况只需要在属性前面加上:即可. eg:

  8. 微信H5的video标签解决方案

    https://github.com/cczw2010/weixin-video 偶尔发现了可以h5化的一种更适合的方式,一个有趣的属性 h5-page 已经更新

  9. [ZJOI2004]嗅探器 (割点)

    这题就比较好玩吧水题 以数据范围来看随便怎么做就能过 \(O(n)\)显然我们得过一个割点,其次这个割点得在\(x-y\)中间且不为始终点 其他都好说,在中间:从\(x\)开始遍历,首先得保证\(x- ...

  10. ansible 主机正则

    ansible <pattern> -m <module_name> -a <arguments> 该功能主要针对Inventory的主机列表,案例如下: 1.AL ...