随笔分类 -  Unity3D

摘要:当我们想要在多个Component之间共享数据时,会想到哪些方案呢? (1)SritptableObject (2)NativeArray (3)ISharedDataComponent (4)BlobAsset (5)unsafe void* (6)... 不错,这些都是常用手段,但是区别甚大,并 阅读全文
posted @ 2020-06-10 23:54 斯芬克斯 阅读(396) 评论(0) 推荐(0) 编辑
摘要:各个工作线程的随机数种子是稳定的,RandomSystem的实现如下: using Unity.Entities; using Unity.Jobs; using Unity.Burst; using Unity.Collections; using Unity.Jobs.LowLevel.Unsa 阅读全文
posted @ 2020-06-10 21:37 斯芬克斯 阅读(820) 评论(2) 推荐(0) 编辑
摘要:将一个方块的AnimationClip数据导出,然后以BlobAsset的方式在JobSystem中并行计算,以提升效率: (1)编辑态,将AnimationClip转为SriptableObject数据,进行存储; (2)运行时,将ScriptableObject数据转换为BlobAsset对象, 阅读全文
posted @ 2020-04-01 03:04 斯芬克斯 阅读(2321) 评论(0) 推荐(0) 编辑
摘要:按照一般的写法,write会产生race condition,所以需要通过依赖关系按顺序执行: using UnityEngine; using Unity.Jobs; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; 阅读全文
posted @ 2020-03-08 23:51 斯芬克斯 阅读(2899) 评论(0) 推荐(0) 编辑
摘要:定义: 使用WriteGroup标记了同一个component的components就属于一个WriteGroup: public struct W : IComponentData { public int Value; } [WriteGroup(typeof(W))] public struc 阅读全文
posted @ 2020-02-29 21:58 斯芬克斯 阅读(721) 评论(0) 推荐(0) 编辑
摘要:结构性修改Structural changes: 任何导致entity的原型(archetype)变化,或者entity在chunk中的存储位置变化的修改,都叫做结构性修改。 以下操作皆为结构性修改: 创建或销毁entity 添加或移除component 修改shared component的值 同 阅读全文
posted @ 2020-02-29 21:57 斯芬克斯 阅读(282) 评论(0) 推荐(0) 编辑
摘要:ECS systems的主要任务就是读取一系列的components数据,计算以后将结果写入其他的components。那么如何高效地读写数据就是很重要的,而有效的方法就是利用cpu的多核特性来并行地读取和处理数据。 ECS提供了多种完成这个任务的方式,每一种都有自己的规则和约束: API 说明 J 阅读全文
posted @ 2020-02-29 16:16 斯芬克斯 阅读(1742) 评论(0) 推荐(1) 编辑
摘要:Systems 提供logic,驱动数据的变更。 Unity ECS会自动在运行时收集所有的systems并进行实例化。 Systems在World中以group的方式来组织,你可以控制将一个system放到哪个group以及这个system在group中的执行顺序(通过system attribu 阅读全文
posted @ 2020-02-16 23:56 斯芬克斯 阅读(751) 评论(0) 推荐(0) 编辑
摘要:Components ECS的Component基于以下这些interface来实现: 类型 说明 IComponentData 常用组件,或者chunk components IBufferElementData 用于将dynamic buffer和entity关联 DynamicBuffer<T 阅读全文
posted @ 2020-02-16 01:00 斯芬克斯 阅读(1077) 评论(0) 推荐(1) 编辑
摘要:Entities是一个ID Entities就是游戏中的“对象”或者“单位”,在ECS里面它表示一组数据的组合。 Systems为它提供行为。 Components为之提供数据存储。 一个Entity就是一个ID,Entity的ID是稳定的,你可以用它来存储对一个component或entity的引 阅读全文
posted @ 2020-02-09 13:18 斯芬克斯 阅读(531) 评论(0) 推荐(0) 编辑
摘要:ECS概念 核心思想:Data-Oriented Tech Stack,不同于传统的Object-Oriented方式。 E:entities C:components——data S:systems——behaviour 上图中System读取Translation和Roation,让后将运算结果 阅读全文
posted @ 2020-02-09 13:09 斯芬克斯 阅读(590) 评论(0) 推荐(0) 编辑
摘要:概述 设计目的:简单安全地使用多线程,随便就能写出高性能代码 收益:FPS更高,电池消耗更低(Burst编译器) 并行性:C# Job System和Unity Native Job System共享工作线程worker threads,也就是它们不会创建超过CPU cores数量的线程,也就不会导 阅读全文
posted @ 2020-02-04 11:53 斯芬克斯 阅读(4931) 评论(0) 推荐(1) 编辑
摘要:直接加载非Readable的Texture,是不能访问其像素数据的: // 加载 var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath); var data = tex.GetPixels(); 上面的代码汇报如下错误: the t 阅读全文
posted @ 2019-10-17 21:30 斯芬克斯 阅读(2109) 评论(2) 推荐(0) 编辑
摘要:ComputeShader: GPGPU:General Purpose GPU Programming,GPU通用计算,利用GPU的并行特性。大量并行无序数据的少分支逻辑适合GPGPU。平台或接口:DirectCompute,OpenCL,CUDA等。 定义:GPGPU编程,运行在GPU上脱离于常 阅读全文
posted @ 2019-08-18 23:48 斯芬克斯 阅读(5854) 评论(0) 推荐(0) 编辑
摘要:编辑器代码如下所示: 阅读全文
posted @ 2019-08-13 16:26 斯芬克斯 阅读(590) 评论(0) 推荐(0) 编辑
摘要:Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办? 很简单,直接使用反射调用即可。 首先使用Reflector或ILSpy将UnityEditor和UnityEngine进行反编译(有源码的可以直接查看源码更好), 阅读全文
posted @ 2018-10-12 18:40 斯芬克斯 阅读(2991) 评论(0) 推荐(0) 编辑
摘要:测试一:使用member function创建action会产生gc,不管该函数是否访问外部变量: private System.Action memberAct = null; // gc 112B private void ActionWithMethod() { memberAct = new 阅读全文
posted @ 2018-10-09 19:02 斯芬克斯 阅读(1206) 评论(0) 推荐(1) 编辑
摘要:一个空场景,添加如下代码: 可以看到每帧有一个固定的内存gc,可以用useGUILayout开关来关闭其gc消耗: 阅读全文
posted @ 2018-09-11 19:15 斯芬克斯 阅读(255) 评论(0) 推荐(0) 编辑
摘要:一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理。 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: 当然bundle也可以通过WWW或其他的方式来加载,这一块Unity5到没有什么变化,具体使用方式可以参考我以前的博客。 阅读全文
posted @ 2017-05-19 20:45 斯芬克斯 阅读(3221) 评论(0) 推荐(0) 编辑
摘要:下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle、asset、gameobject三种类型对象的操作,实际使用中尽量保证成对使用。 这一块的操作比较繁琐,但只要使用正确,是可以保证资源完全没有泄露的。 由于bundle相互之前会有依赖,所以在使用一个bundle包之前, 阅读全文
posted @ 2017-05-19 20:39 斯芬克斯 阅读(20469) 评论(0) 推荐(2) 编辑