Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

AsyncReadManager.ReadDeferred

Объявление

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(); } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3