IDeviceContext
интерфейс в UnityEngine.LightTransport
Описание
Обеспечивает слой абстракции для управления памятью, синхронизации и вычислительных операций на различных устройствах.
Интерфейс IDeviceContext абстрагирует операции с памятью, синхронизацией и вычислениями для разных вычислительных устройств — CPU и GPU. Он позволяет писать код независимо от реализации, сохраняя доступ к оптимизациям конкретного устройства.
Unity предоставляет конкретные реализации этого интерфейса, в том числе: UnityEngine.LightTransport.RadeonRaysContext — для операций с ускорением на GPU через OpenCL 1.2.
Интерфейс управляет выделением буферов, асинхронными операциями через события и передачей данных между памятью хоста и устройства.
// Create and initialize a device context using var context = new RadeonRaysContext(); bool initialized = context.Initialize(); Assert.IsTrue(initialized, "Failed to initialize context");
// Create a buffer and perform read/write operations BufferID bufferId = context.CreateBuffer(1024, sizeof(int)); var bufferSlice = new BufferSlice<int>(bufferId, 0);
// Write data asynchronously using var inputData = new NativeArray<int>(1024, Allocator.Persistent); for (int i = 0; i < inputData.Length; i++) inputData[i] = i;
var writeEvent = context.CreateEvent(); context.WriteBuffer(bufferSlice, inputData, writeEvent);
// Read data back using var outputData = new NativeArray<int>(1024, Allocator.Persistent); var readEvent = context.CreateEvent(); context.ReadBuffer(bufferSlice, outputData, readEvent);
// Flush and wait for completion context.Flush(); context.Wait(readEvent);
// Cleanup context.DestroyEvent(writeEvent); context.DestroyEvent(readEvent); context.DestroyBuffer(bufferId);
Открытые методы
| Метод | Описание |
|---|---|
| CreateBuffer | Выделяет новый буфер на устройстве с указанным количеством элементов и шагом. |
| CreateEvent | Создает событие синхронизации для отслеживания асинхронных операций. |
| DestroyBuffer | Уничтожить буфер с заданным ID. |
| DestroyEvent | Уничтожить событие с заданным ID. Вы должны вызвать это, чтобы освободить временные ресурсы, связанные с событием. Попытка использовать событие после того, как оно было уничтожено, например, с помощью IDeviceContext.Wait или IDeviceContext.IsCompleted, приведет к неопределенному поведению. |
| Flush | Инициирует выполнение всех очередных операций на устройстве. |
| Initialize | Инициализация. |
| IsCompleted | Возвращает true, если асинхронная операция завершена. |
| ReadBuffer | Асинхронное копирование данных из буфера устройства в память узла. |
| Wait | Дождитесь асинхронного события. |
| WriteBuffer | Асинхронное копирование данных из памяти узла в буфер устройства. |