RadeonRaysContext.ReadBuffer
Declaration
public void ReadBuffer(BufferSlice<T> src, NativeArray<T> dst);public void ReadBuffer(BufferSlice<T> src, NativeArray<T> dst, LightTransport.EventID id);Параметры
| Параметр | Описание |
|---|---|
| сердце | Срез буфера для чтения. |
| дст | Массив в памяти CPU, в который должно быть записано содержимое буфера. Массив должен оставаться действительным до завершения операции чтения. Связанное содержимое: IDeviceContext.Wait. |
| Идентификатор | ID события, которое будет использоваться для отслеживания завершения чтения. |
Описание
Чтение содержимого буфера из контекста.
Память, на которую указывают BufferSlice<T0>, может быть перенесена в NativeArray<T0>. Это асинхронная операция. Передайте EventID, созданный с помощью IDeviceContext.CreateEvent, чтобы отслеживать состояние завершения, если это необходимо. Этот метод возвращается сразу после очереди команды в контексте.
Примечание: EventID одноразового использования. После того, как EventID был передан этой функции, он не может быть передан последующим вызовам IDeviceContext.WriteBuffer или IDeviceContext.ReadBuffer. Это приведет к неопределенному поведению.
using Unity.Collections; using UnityEngine.LightTransport;
IDeviceContext ctx = new RadeonRaysContext(); ctx.Initialize(); uint length = 8; var input = new NativeArray<byte>((int)length, Allocator.Persistent); for (int i = 0; i < length; ++i) input[i] = (byte)i; var output = new NativeArray<byte>((int)length, Allocator.Persistent); BufferID id = ctx.CreateBuffer(8); var writeEvent = ctx.CreateEvent(); ctx.WriteBuffer(id.Slice<byte>(), input, writeEvent); var readEvent = ctx.CreateEvent(); ctx.ReadBuffer(id.Slice<byte>(), output, readEvent); bool flushOk = ctx.Flush(); Assert.IsTrue(flushOk); bool eventOk = ctx.Wait(writeEvent); Assert.IsTrue(eventOk);
// Contents of the buffer is now available in the CPU side memory array output.
input.Dispose(); Assert.IsTrue(ctx.IsCompleted(readEvent)); ctx.DestroyEvent(readEvent); ctx.DestroyEvent(writeEvent); ctx.DestroyBuffer(id); for (int i = 0; i < length; ++i) Assert.AreEqual((byte)i, output[i]); output.Dispose(); ctx.Dispose();
Как читать обратно буфер.