我正在尝试使用 Desktop Duplication API 捕获桌面帧,并立即使用 NvPipe 对其进行编码,而无需通过 CPU 访问像素。
有什么方法可以将 ID3D11Texture2D 数据作为 NvPipe 的输入,或者其他一些有效的方法?我正在开发一个需要尽可能低延迟的 VR 解决方案,因此即使节省 1 毫秒也是一件大事。
编辑:在遵循@Soonts 的建议之后,我得到了这个似乎不起作用的代码:
cudaArray *array;
m_DeviceContext->CopySubresourceRegion(CopyBuffer, 0, 0, 0, 0, m_SharedSurf, 0, Box);
cudaError_t err = cudaGraphicsD3D11RegisterResource(&_cudaResource, CopyBuffer, cudaGraphicsRegisterFlagsNone);
err = cudaGraphicsResourceSetMapFlags(_cudaResource, cudaGraphicsMapFlagsReadOnly);
cudaStream_t cuda_stream;
cudaStreamCreate(&cuda_stream);
err = cudaGraphicsMapResources(1, &_cudaResource, cuda_stream);
err = cudaGraphicsSubResourceGetMappedArray(&array, _cudaResource, 0, 0);
uint64_t compressedSize = NvPipe_Encode(encoder, array, dataPitch, buffer.data(), buffer.size(), width, height, false);
NvPipe_Encode 导致内存访问冲突并且什么都不做。我不知道我搞砸了哪一步,因为我似乎无法在网上找到任何关于任何函数或变量/结构的文档,并且将手表放在变量上除了它们在内存中的地址之外没有显示任何有价值的信息。