前言
工作线程(多线程)是指在一个程序中同时执行多个任务的能力。多线程编程可以提高程序的性能和响应性,特别是在需要同时执行多个任务的情况下。工作线程通常用于执行耗时的任务,以避免阻塞主线程,从而保持程序的流畅性。
一、异步加载
/// <summary>
/// 异步加载
/// </summary>
/// <param name="logic"></param>
/// <param name="onComplete"></param>
public static void AsyncLoad(System.Action logic, System.Action onComplete)
{
//UIKit.OpenPanel<LoadingPanel>();
AsyncExecute(
() =>
{
logic?.Invoke();
},
() =>
{
onComplete?.Invoke();
//UIKit.HidePanel<LoadingPanel>();
}
);
}
/// <summary>
/// 异步执行
/// </summary>
/// <param name="logic"></param>
/// <param name="onComplete"></param>
public static async void AsyncExecute(System.Action logic, System.Action onComplete)
{
await Task.Run(() => logic?.Invoke());
onComplete?.Invoke();
}
二、工作线程
我们继承只需要继承IJobParallelForTransform接口,并且实现Execute()方法,就可以在工作线程中处理耗时操作了
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Jobs;
public class Test : MonoBehaviour {
public Transform[] cubes;
void Update()
{
//按下鼠标左键后
if(Input.GetMouseButtonDown(0))
{
//随机设置坐标
NativeArray<Vector3> position = new NativeArray<Vector3>(cubes.Length,
Allocator.Persistent);
for(int i = 0; i < position.Length; i++){
position[i] = Vector3.one * i;
}
//设置Transform
TransformAccessArray transformArray = new TransformAccessArray(cubes);
//启动工作线程
MyJob job = new MyJob(){position = position};
JobHandle jobHandle = job.Schedule(transformArray);
//等待工作线程结束
jobHandle.Complete();
Debug.Log("工作线程结束");
//结束
transformArray.Dispose();
position.Dispose();
}
}
struct MyJob : IJobParallelForTransform
{
//只读属性
[ReadOnly]public NativeArray<Vector3> position;
public void Execute(int index, TransformAccess transform)
{
//工作线程中设置坐标
transform.position = position[index];
}
}
}
注意,主线程和工作线程的数据需要使用Native来传递。工作线程只需要读数据,并不需要设置数据,所以需要标记[ReadOnly]。
总结
目前很多主流游戏或软件在启动或下载等待时会使用多线程技术,应用十分广泛,本人也在工作中遇到。本篇抛砖引玉,记录一些用法,希望对大家有用。