[Unity]并行操作Transform

  • 确定需要操作什么数据,这里就让所有物体全部向上移动
  • 编写一个结构体,实现UnityEngine.Jobs.IJobParallelForTransform接口
  • Burst强无敌
1
2
3
4
5
6
7
8
9
10
[BurstCompile]
private struct Move : IJobParallelForTransform
{
public float DeltaTime;

public void Execute(int index, TransformAccess transform)
{
transform.position += Vector3.up * DeltaTime;
}
}
  • 创建一个UnityEngine.Jobs.TransformAccessArray类型的变量,用于保存所有需要修改Transform的游戏物体。这是个结构体,而且必须在不使用时调用其成员方法Dispose()来销毁,否则会造成内存泄漏。在构造时可以直接传入Transform数组,也可以调用Add成员方法添加Transform。辣鸡Unity,追踪这个结构体的实现,发现全是extern方法,还不支持C#8,吃枣药丸
  • 每帧调用。实例化一个结构体,调用Schedule方法,传入TransformAccessArray
1
2
3
4
5
6
7
8
9
10
11
private void Update()
{
using (var arr = new TransformAccessArray(_targetTrans))
{
var handler = new Move
{
DeltaTime = Time.deltaTime
}.Schedule(arr);
handler.Complete();
}
}
  • 运行!
  • 6k个对象(非同屏)跑出了250帧的好成绩(编辑器内),比之前直接Update里写不知道高到哪里去了

[Unity]并行操作Transform
https://ksgfk.github.io/2020/06/22/Unity-并行操作Transform/
作者
ksgfk
发布于
2020年6月22日
许可协议