Объявление
public static Unity.IO.LowLevel.Unsafe.ReadHandle ReadDeferred(ref Unity.IO.LowLevel.Unsafe.FileHandle fileHandle, ReadCommandArray* readCmdArray, Unity.Jobs.JobHandle dependency);Параметры
fileHandle | FileHandle для чтения, открытый с помощью AsyncReadManager.OpenFileAsync. |
readCmdArray | Указатель на структуру, содержащую команды чтения для постановки в очередь. |
dependency | Зависимость, которая вызовет начало чтения. |
Возвращает
ReadHandle Объект ReadHandle, который можно использовать для проверки состояния и отслеживания хода операций чтения.
Описание
Помещает в очередь набор операций чтения для файла после завершения указанных заданий.
Эта функция не создает копию структуры ReadCommandArray, переданной в качестве параметра. Вы можете изменять команды чтения до тех пор, пока задания, переданные этой функции в качестве зависимости, не будут завершены. Чтение будет автоматически ожидать завершения FileHandle.JobHandle.
Поскольку это небезопасный низкоуровневый API, пользователь обязан избегать изменения или освобождения ReadCommandArray после начала операции чтения. . Это может привести к переполнению буфера и состояниям гонки. (Если вы меняете количество команд, не забудьте также обновить поле ReadCommandArray.CommandCount.)
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 struct ReadCommandJob : IJob
{
public NativeArray<ReadCommandArray> ReadCmdArrayNative;
public void Execute()
{
const int kReadCount = 1;
const int kReadSize = 2048;
ReadCommand* readCmds = (ReadCommand*)UnsafeUtility.Malloc(sizeof(ReadCommand) * kReadCount, 16, Allocator.Persistent);
readCmds[0] = new ReadCommand()
{
Buffer = (byte*)UnsafeUtility.Malloc(kReadSize, 16, Allocator.Persistent),
Offset = 0,
Size = kReadSize
};
ReadCmdArrayNative[0] = new ReadCommandArray
{
ReadCommands = readCmds,
CommandCount = kReadCount
};
}
}
public unsafe void SetupReadInJob()
{
NativeArray<ReadCommandArray> readCmdArrayNative = new NativeArray<ReadCommandArray>(1, Allocator.Persistent);
ReadCommandArray* readCmdArrayPtr = (ReadCommandArray*)readCmdArrayNative.GetUnsafePtr();
FileHandle fileHandle = AsyncReadManager.OpenFileAsync(TestFilename);
var createReadCommandJob = new ReadCommandJob
{
ReadCmdArrayNative = readCmdArrayNative
}.Schedule();
ReadHandle readHandle = AsyncReadManager.ReadDeferred(fileHandle, readCmdArrayPtr, createReadCommandJob);
JobHandle closeJob = fileHandle.Close(readHandle.JobHandle);
createReadCommandJob.Complete(); // Ensure the NativeArray is finished with before using
closeJob.Complete();
// ... Use the data read into the buffer
readHandle.Dispose();
for (int i = 0; i < readCmdArrayNative[0].CommandCount; i++)
UnsafeUtility.Free(readCmdArrayNative[0].ReadCommands[i].Buffer, Allocator.Persistent);
UnsafeUtility.Free(readCmdArrayNative[0].ReadCommands, Allocator.Persistent);
readCmdArrayNative.Dispose();
}
}