filename | 要从中读取的文件名。 |
readCmds | 指向 ReadCommand 结构体数组的指针,这些结构体指定偏移量、大小和目标缓冲区。 |
readCmdCount | readCmds 指向的读取命令的数量。 |
assetName | (可选)正在读取的对象的名称,用于指标目的。 |
typeID | (可选)正在读取的对象的TypeID,用于指标目的。 |
subsystem | (可选)读取操作的子系统标签,用于指标目的。 |
ReadHandle 用于监控读取命令的进度和状态。
发出异步文件读取操作。返回一个 ReadHandle。
您可以设置assetName
、typeId
和subsystem
参数来收集此读取操作的特定于资产的指标。当您使用AsyncReadManagerMetrics.StartCollectingMetrics启用指标收集时,Unity 会将此信息作为AsyncReadManagerMetrics的一部分包含在内,允许您分析不同类型的资产如何影响性能。
AsyncReadManager 复制Read
引用的数据;您可以在调用Read
后立即处理或释放数据。
using System.IO; using Unity.Collections; using Unity.IO.LowLevel.Unsafe; using Unity.Collections.LowLevel.Unsafe; using UnityEngine;
class AsyncReadSample : MonoBehaviour { private ReadHandle readHandle; NativeArray<ReadCommand> cmds; string assetName = "myfile"; ulong typeID = 114; // from ClassIDReference AssetLoadingSubsystem subsystem = AssetLoadingSubsystem.Scripts;
public unsafe void Start() { string filePath = Path.Combine(Application.streamingAssetsPath, "myfile.bin"); cmds = new NativeArray<ReadCommand>(1, Allocator.Persistent); ReadCommand cmd; cmd.Offset = 0; cmd.Size = 1024; cmd.Buffer = (byte*)UnsafeUtility.Malloc(cmd.Size, 16, Allocator.Persistent); cmds[0] = cmd; readHandle = AsyncReadManager.Read(filePath, (ReadCommand*)cmds.GetUnsafePtr(), 1, assetName, typeID, subsystem); }
public unsafe void Update() { if (readHandle.IsValid() && readHandle.Status != ReadStatus.InProgress) { Debug.LogFormat("Read {0}", readHandle.Status == ReadStatus.Complete ? "Successful" : "Failed"); readHandle.Dispose(); UnsafeUtility.Free(cmds[0].Buffer, Allocator.Persistent); cmds.Dispose(); } } }
fileHandle | 要从中读取的文件句柄,由AsyncReadManager.OpenFileAsync打开。 |
readCmdArray | 包含要排队的读取命令的结构体。 |
ReadHandle 一个ReadHandle 对象,您可以使用它来检查状态并监控读取操作的进度。
为使用OpenFileAsync打开的文件排队一组读取操作。
此函数在内部复制作为参数传递的ReadCommandArray 结构体,因此您无需维护该数组。注意:WebGL 构建不支持使用AsyncReadManager
从远程 Web 服务器打开文件;例如,从路径Application.streamingAssetsPath
映射到远程 Web 服务器上的 URL。
using System.IO; using Unity.Collections; using Unity.IO.LowLevel.Unsafe; using Unity.Collections.LowLevel.Unsafe; using UnityEngine; using Unity.Jobs;
class AsyncReadSample : MonoBehaviour { static string TestFilename = Path.Combine(Application.streamingAssetsPath, "myfile.bin");
public unsafe void Start() { ReadCommand cmd; cmd.Offset = 0; cmd.Size = 1024; cmd.Buffer = (byte*)UnsafeUtility.Malloc(cmd.Size, 16, Allocator.Persistent);
FileHandle fileHandle = AsyncReadManager.OpenFileAsync(TestFilename);
ReadCommandArray readCmdArray; readCmdArray.ReadCommands = &cmd; readCmdArray.CommandCount = 1;
ReadHandle readHandle = AsyncReadManager.Read(fileHandle, readCmdArray);
JobHandle closeJob = fileHandle.Close(readHandle.JobHandle);
closeJob.Complete();
// ... Use the data read into the buffer
readHandle.Dispose();
for (int i = 0; i < readCmdArray.CommandCount; i++) UnsafeUtility.Free(readCmdArray.ReadCommands[i].Buffer, Allocator.Persistent); } }