Unity Entity Component System --- Shared Component Data

Shared components 是一种特殊的数据组件,可以根据shared componet的不同数值,来将entities进一步细分。当将一个shared component添加到一个entity,Entity Manager会将所有共享该shared component(值相同,则是一个),存储到一个Chunk。Shared components允许你的系统一起处理处理相似的entities。例如,Rendering.RenderMesh,定义在Hybrid.rendering包中的shared component,还包括mesh, material, receiveShadows等。渲染时,同时处理拥有相同的该类组件的3D对象会大大提升效率。因为这些组件时shared components,所以Entity Manager会把匹配的entities放到同一个chunk中,这样进行遍历渲染时会更加有效率。

注意:过度使用shared component会导致Chunk利用率降低。因为这引入了Archetype和每个值的shared component之间的组合数量的急剧扩大,而每种组合都要分配Chunk,导致分配更多的内存。避免添加不是必须的shared components。可以利用Entity Debugger来查看当前的Chunk利用率。

向一个Entity添加,删除component,或者改变SharedComponent的值,Entity Manage都会将该Entity移动到其它匹配的Chunk,或者创建新的Chunk。

IComponentData通常适用于entities之间不同的数据,比如世界位置,打击点,粒子存活时间,等。ISharedComponentData适用于多个entities共享的数据。例如RenderMesh,所有实例化自同一个模型的对象,共享同一个RenderMesh。

[System.Serializable]
public struct RenderMesh : ISharedComponentData
{
    public Mesh                 mesh;
    public Material             material;
    public ShadowCastingMode    castShadows;
    public bool                 receiveShadows;
}

ISharedComponentData的最大好处,是每个对象在共享数据上的内存占用为0。

使用ISharedComponentData将使用同样的InstanceRenderer(渲染数据)的entities组织到一起,来更加高效地进行渲染。因为这些数据是线性排布的。

参考:RenderMeshSystemV2

Some important notes about SharedComponentData

使用SharedComponentData需要重点注意的几点:

引用同一个SharedComponentData的entities被组织到同一个Chunk中。存储SharedComponentData的索引,只在Chunk中保存,而不是在entities中保存。所以SharedComponentData对于entities的内存占用为0.
使用EntityQuery可以遍历所有相同类型的entities。
此外,可以通过调用EntityQuery.SetFilter()来遍历指定SharedComponentData的值的entities。基于数据的排布,这种遍历消耗并不高。
使用EntityManager.GetAllUniqueSharedComponents可以得到所有添加到entities上的唯一的SharedComponentData(其值唯一,没有变体)。(大概是这个意思,不太理解这句话)。
SharedComponentData自动维护引用计数。
SharedComponentData应该尽量少的改变。改变一个SharedComponentData会导致调用memcpy来将引用它的entities的Component Data拷贝到其它Chunk。

Unity中进行multipart/form-data上传,可以使用UnityWebRequest类。具体步骤如下: 1. 创建一个UnityWebRequest对象,并设置请求的URL和请求方法为POST。 2. 设置请求头部信息,包括Content-Type为multipart/form-data,以及其他必要的信息。 3. 构造表单数据,将需要上传的数据按照multipart/form-data格式进行编码,并设置到UnityWebRequest对象中。 4. 发送请求,并等待服务器响应。 以下是一个示例代码: ``` IEnumerator UploadFile(string url, byte[] data) { UnityWebRequest request = new UnityWebRequest(url, "POST"); request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=------------------------boundary"); string boundary = "--------------------------boundary"; byte[] formHeaderBytes = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"); byte[] formFooterBytes = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); byte[] bodyBytes = new byte[formHeaderBytes.Length + data.Length + formFooterBytes.Length]; System.Buffer.BlockCopy(formHeaderBytes, 0, bodyBytes, 0, formHeaderBytes.Length); System.Buffer.BlockCopy(data, 0, bodyBytes, formHeaderBytes.Length, data.Length); System.Buffer.BlockCopy(formFooterBytes, 0, bodyBytes, formHeaderBytes.Length + data.Length, formFooterBytes.Length); request.uploadHandler = new UploadHandlerRaw(bodyBytes); request.downloadHandler = new DownloadHandlerBuffer(); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log("Upload complete!"); } else { Debug.Log("Error during upload: " + request.error); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值