Объявление
public static Unity.IO.LowLevel.Unsafe.ReadHandle Read(string filename, ReadCommand* readCmds, uint readCmdCount, string assetName, ulong typeID, Unity.IO.LowLevel.Unsafe.AssetLoadingSubsystem subsystem);Параметры
filename | Имя файла для чтения. |
readCmds | Указатель на массив структур ReadCommand, которые определяют смещение, размер и целевой буфер. |
readCmdCount | Количество команд чтения, на которое указывает readCmds. |
assetName | (Необязательно) Имя считываемого объекта для целей метрики. |
typeID | (Необязательно) TypeID считываемого объекта для целей метрики.. |
subsystem | (Optional) The Subsystem tag for the read operation, for metrics purposes. |
Возвращает
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 ClassIDReferenceAssetLoadingSubsystem 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();
}
}
}
Объявление
public static Unity.IO.LowLevel.Unsafe.ReadHandle Read(ref Unity.IO.LowLevel.Unsafe.FileHandle fileHandle, Unity.IO.LowLevel.Unsafe.ReadCommandArray readCmdArray);Параметры
fileHandle | FileHandle для чтения, открытый с помощью AsyncReadManager.OpenFileAsync. |
readCmdArray | Структура, содержащая команды чтения для постановки в очередь. |
Возвращает
ReadHandle Объект ReadHandle, который можно использовать для проверки состояния и отслеживания хода операций чтения.
Описание
Помещает в очередь набор операций чтения для файла, открытого с помощью OpenFileAsync.
Эта функция создает копию структуры ReadCommandArray, переданной в качестве внутреннего параметра, поэтому вам не нужно поддерживать массив.
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);
}
}