Unity 6.3
0 онлайн 13 гостей 3 в системе
Вход

AsyncReadManager.ReadDeferred

Declaration

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 Указатель на структуру с командами чтения, которые нужно поставить в очередь.
зависимость Зависимость, которая будет вызывать начало чтения.

Возвращаемое значение

ReadHandle Объект ReadHandle, который можно использовать для проверки состояния и мониторинга прогресса операций чтения.

Описание

Создает очередь операций чтения для файла после завершения выполнения указанных Задач.

Эта функция не создает копию файла ReadCommandArray структуру, переданную параметром. Изменять команды чтения можно до тех пор, пока не завершатся задания, переданные этой функции как зависимости. Чтение автоматически дождётся FileHandle.JobHandle должна быть полной.

Как небезопасный, низкоуровневый API, это ответственность пользователя избегать изменения или освобождения ReadCommandArray после начала операции чтения. Это может привести к переполнению буфера и условиям гонки. (Если вы измените количество команд, не забудьте обновить ReadCommandArray.CommandCount поле, тоже.)

Примечание: WebGL сборки не поддерживают использование AsyncReadManager для открытия файлов с удаленного веб-сервера; например, из пути Application.streamingAssetsPath который сопоставляется с 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 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(); } }