UnityECS
嵩小帽子啊
除了生孩子什么都懂~~~~~~!!!
展开
-
UnityECS学习日记二十三:BlobAsset
BlobAsset本质上是容器,可以通过引用访问不可变数据,是unity内部用来处理物理的东西,形状碰撞数据,其点,动画数据,曲线等 使用拥有的任何类型的不可变数据,没有线程安全问题。BlobArray:包含多个数据实例的普通数组BlobPtr指针:指向单个实例的简单指针BlobString:存储字符串上篇通过对实体添加 DynamicsBuffer ,来实现“列表”的概念,如果想多个实体公用一个“列表”,则需要Blob资产来实现。比如:一群敌人按照指定路线进行寻路,则 DynamicB原创 2020-05-25 23:29:21 · 2122 阅读 · 2 评论 -
UnityECS学习日记二十二:DynamicBuffer Component(动态缓冲区组件)
在ECS中通用组件只能存储值类型而没有引用类型,因此我们无法定义数组或列表。unity提供了DynamicBuffer的方式。如下:using UnityEngine;using Unity.Entities;[InternalBufferCapacity(3)]public struct IntBufferElement : IBufferElementData{ public int value;}public class TestVae : MonoBehaviour{原创 2020-05-22 14:20:40 · 1417 阅读 · 0 评论 -
UnityECS学习日记二十一:ECS + Graphics优化渲染sprite动画
using UnityEngine;using Unity.Entities;using Unity.Transforms;using Unity.Collections;using System.Collections.Generic;using Unity.Mathematics;[UpdateAfter(typeof(SpriteSheetAnimation_JobSyste...原创 2020-04-23 11:59:10 · 3716 阅读 · 1 评论 -
UnityECS学习日记二十:ECS+Graphics渲染简单sprite动画
使用的是Entities(0.9.1)版本,渲染sprite动画需要自定义着色器,将动画图集进行分割然后分帧显示在实体位置。如上图,通过实体控制器创建实体,然后使用Graphics API进行渲染,通过自定义着色器,每帧进行判定切换显示UV范围,实现动画效果。自定义Shder:支持GPU实例化Shader "Custom/InstancedShader"{ Prope...原创 2020-04-21 15:28:20 · 2603 阅读 · 0 评论 -
UnityECS学习日记十九:UnityECS的特性(Attribute)
特性(Attribute) 修饰类型 功能(待定表示还待补全) [AlwaysUpdateSystem] Class 总是更新系统 [BurstCompile] Struct Burs编译(Job结构体) [ReadOnly] NativeArray 只读模式,速度更快 [NativeDisableParallelForRestric...原创 2020-01-19 21:06:13 · 807 阅读 · 0 评论 -
UnityECS学习日记十八:SubScene场景解决方案
对于大型场景我们如何预先摆放在unity的world中呢?unity提供了SubScene,如下图:当前SubScene是编辑状态下,可以看成预制体的方式,方便修改,一个world可以多个SubScene进行加载,个人认为节省了将Gameobject转换为实体的步骤。1.当你保存一个场景,Unity会将SubScene转换成一个原生的二进制格式,这个格式对内存而言是可...原创 2020-01-10 15:51:00 · 5240 阅读 · 1 评论 -
UnityECS学习日记十七:UnityECS多种组件类型
UnityECS的组件是专门用来存储数据的数据结构一般继承自IComponentData接口,当然Unity还提供了其他类型组件。1.IShareComponentData接口,定义共享数据组件。using Unity.Entities;using UnityEngine;public struct OtherComponentData : IComponentData{}...原创 2020-01-06 00:00:13 · 819 阅读 · 0 评论 -
UnityECS学习日记十六:UnityECS使用EntityQuery(实体筛选器)
ECS中所有实体以ID的方式进行存储,正常游戏物体要分很多种类型,还要对不同类型分别进行操作,这就需要筛选器来获取你想要的操作的实体对象进行修改数据。案例十四:EntityQuery(实体筛选器)(Scne15)用到的ComponetData:using Unity.Entities;public struct ComponentA : IComponentData{ ...原创 2020-01-02 23:31:30 · 1959 阅读 · 0 评论 -
UnityECS学习日记十五:UnityECS中EntityCommandSystem在主线程中的使用
前边讲了在Job中动态创建需要EntityCommandSystem来实现,而在主线程中的Foreach中也是要使用Unity指定方式PostUpdateCommands来实现:案例十三:主线程使用实体缓冲命令创建物体(Scne14)脚本:EntityBuffer_Prefabusing System.Collections.Generic;using UnityEngine;u...原创 2019-12-29 23:44:36 · 581 阅读 · 1 评论 -
UnityECS学习日记十四:UnityECS的System执行顺序(必读!)
如同Unity的Monobehaviour一样,UnityECS也有自己的生命周期,并且工作中对逻辑处理也要进行区分执行顺序。ComponentSystem与JobComponentSystem中的OnUpdate都是每一帧执行。区别是前者在主线程,后者在子线程运行,并且当job中筛选出来的Entity(实体)数量大于0时才会被调用。如下图Unity提供了三种分组:如图上,Unity又在各...原创 2019-12-27 23:34:16 · 1506 阅读 · 0 评论 -
UnityECS学习日记十三:Job中动态创建实体(实体命令缓冲系统)
在以前的案例中,通常实体都是在主线程进行动态创建的,而想在Job中进行动态创建,Unity提供了EntityCommandBuffer(实体命令缓冲)概念,它解决了两个问题:1.在Job中无法访问EntityManager。2.当访问EntityManager时(例如,创建实体),将使所有注入的数组和EntityQuery对象无效。案例十一:Job中创建实体模拟细胞分裂(Scne12)...原创 2019-12-26 23:39:23 · 1005 阅读 · 0 评论 -
UnityECS学习日记十二:Unity Job System中IJobChunk的使用
内存块(IJobChunk),这个块是被一开始基于相同原型分配好了的,也就是说,如果实体有相同的组件,那么他们会被紧密的安排在一块内存中,从而方便处理器进行操作。这是相对于面向对象的散列内存而言的,在面向对象中要操作内存中的某个对象时,你不得不在整个内存中寻找它,这样会降低读取速度,也不方便批量操作。ECS则会非常紧密地分配实体在内存中的位置,相同的组件会被统一放在块中,读取速度快,也方便批量操作...原创 2019-12-24 14:47:05 · 1629 阅读 · 0 评论 -
UnityECS学习日记十一:UnityECS与Unity Job System使用
使用实体组件系统和作业系统一起使用让性能起飞!案例九:UnityECS和Job系统模拟雨滴降落(Scne10)脚本:PureJob_DropDatausing Unity.Entities;[System.Serializable]public struct PureJob_DropData : IComponentData{ public int velocity;...原创 2019-12-23 18:29:12 · 621 阅读 · 0 评论 -
UnityECS学习日记十:Unity Job System 之 Job组合关系
上篇提到:如果一个job有多个依赖项,你可以使用JobHandle.CombineDependencies方法来合并他们。CombineDependencies允许你将他们传递给Schedule方法。例如生活中想要煮面条,我们要向锅中加入水,然后等水烧开才能下面条,下面条就要依赖:加水、水烧开这两个条件,JobHandle结构体提供了静态方法来实现,它返回的也是个JobHandle。案例...原创 2019-12-23 15:17:39 · 818 阅读 · 0 评论 -
UnityECS学习日记九:Unity Job System 之 Job依赖关系
多线程开发,数据加载与计算也是在主线程基础上分前后顺序的,这里就要了解Job间的依赖关系。JobHandle和依赖关系:当你调用Schedule方法时会返回一个JobHandle。你可以在代码中使用JobHandle作为其他jobs的依赖关系。组合依赖关系:如果一个job有多个依赖项,你可以使用JobHandle.CombineDependencies方法来合并他们。Combine...原创 2019-12-23 14:49:06 · 1083 阅读 · 0 评论 -
UnityECS学习日记八:Unity Job System 之 IJobParallelFor 多线程并行化
上篇提到:IJOB接口是一个一个的开线程任务,因为数据是顺序执行的所以它可以保证正确性。如果想让线程人物真正的并行,那么可以采用IJobParallelFor。案例六:IJobParallelFor多线程并行化控制指定数量cube向上移动(Scne7)脚本:JobParallelForTestusing UnityEngine;using Unity.Jobs;using Uni...原创 2019-12-23 00:37:38 · 4448 阅读 · 0 评论 -
UnityECS学习日记七:Unity Job System 之 IJob 多线程接口
上篇提到NativeContainer托管的数据类型,为Unity线程和job线程进行数据交换,它的内存分配有三种分配类型,当初始化时需要指定一个合适的分配器。有:1.Allocator.Temp是最快的分配类型。它适用于分配一个生命周期只有一帧或更短时间的操作。你不应当把一个分配器为Temp类型分配的NativeContainer传递给jobs使用。你同时需要在函数返回之前调用Dispose...原创 2019-12-22 02:12:17 · 1875 阅读 · 0 评论 -
UnityECS学习日记六:Unity Job System
前几篇提过ECS系统的好基友:Unity Job System ,这个是untiy为我们提供多线程开发的基础库。先前说过我们平时Update多是单线程开发,unity早就支持多线程开发。而c#的多线程开发中子线程不能操控UI线程。我们需要了解什么是多线程开发:1.上下文环境隔离比如妈妈拿钱让小孩去打酱油,钱对于妈妈来说不再控制了,上下文运行环境是隔离的。2.进程同步技术比如妈妈...原创 2019-12-21 01:01:24 · 822 阅读 · 0 评论 -
UnityECS学习日记五:Hybrid(混合)ECS
案例四:Hybrid(混合)ECS动态创建指定数量的小球Entity(实体)(Scne5)Hybrid编程 GameObject转变为实体,使用unity的预制体来动态创建数量级雨滴下落。在上篇的基础上,将Unity预制体加入代理来实现。脚本:DropData_Hybridusing Unity.Entities;[System.Serializable]public str...原创 2019-12-20 00:25:07 · 2772 阅读 · 3 评论 -
UnityECS学习日记四:PureECS(纯ECS开发)
案例三:使用Entity小球模拟数量级雨滴效果(Scne4)本案例将结合上篇动态创建小球和第二篇学的ComponentSystem(组件系统)来模拟雨滴产生和下落过程,首先雨滴下落逻辑图:脚本:DropDatausing UnityEngine;using Unity.Entities;using Unity.Mathematics;[System.Se...原创 2019-12-19 00:53:00 · 1246 阅读 · 0 评论 -
UnityECS学习日记三:PureECS(纯ECS开发)
案例二:PureECS(纯ECS)动态创建指定数量的小球Entity(实体)(Scne3)脚本:PureMainusing System.Collections;using System.Collections.Generic;using UnityEngine;using Unity.Entities;using Unity.Collections;using U...原创 2019-12-17 20:50:05 · 1302 阅读 · 0 评论 -
UnityECS学习日记二:HybridECS(混合ECS开发)与PureECS(纯ECS开发)
UnityECS框架又分为:HybridECS(混合ECS开发):这个会和原来的MonoBehaviour组合开发,中间需要一层代理来实现,性能肯定不如PureECS。PureECS(纯ECS开发):这就要你重新接受一种新的开发思维,性能最好。注意:我使用为Unity2019.1.6f1版本 ,直接在包管理器中使用Entities33版本目前我这最高的,有的人左下角loading加载时...原创 2019-12-17 15:14:19 · 2780 阅读 · 0 评论 -
UnityECS学习日记一:UnityECS与传统开发方式的区别
目前程序开发分为:面向过程开发(c 语言 ),面向对象开发( unity传统开发方式 ),面向数据开发(ECS)大致这三种。Unity官方2018开始,推出了DOTS(多线程式数据导向型技术栈),其中分别用到的技术:ECS 、Jobs System、Burst 。首先要明白UnityECS开发方式和传统开发方式区别是如何提高游戏性能的:传统的GameObject系统:传统开发...原创 2019-12-17 02:44:17 · 2418 阅读 · 0 评论