Skip to main content

AsyncGPUReadback

Unity 中的 AsyncGPUReadback 是一项功能,允许开发者从 GPU 上的纹理复制数据(例如特定像素的颜色)到 CPU 上的代码。此函数类似于 Texture2D.GetPixels,区别在于它异步运行,不会阻塞主线程上的任务。

通过异步执行数据传输,Unity 确保该过程不会对应用程序的帧率和整体性能产生负面影响。AsyncGPUReadback 帮助开发者避免渲染管道停滞,因为数据传输在后台与主线程并行发生。

AsyncGPUReadback 的常见用例包括基于渲染输出生成 CPU 端数据,例如创建纹理 mipmap 链、实现自定义后处理效果,或为 AI 和计算机视觉目的分析渲染帧。

Unity AsyncGpuReadback 与 VRCAsyncGpuReadback 的差异​

VRChat 对 AsyncGpuReadback 的实现使用了一个包装器来调用 Unity 的函数。此包装器使用不同的接口。差异如下:

  • 你需要使用 VRCAsyncGpuReadback,而不是直接调用 AsyncGpuReadback。
  • 你需要提供一个 UdonBehaviour,而不是提供 Action<AsyncGPUReadbackRequest> callback,当回读完成时,该 UdonBehaviour 将收到 OnAsyncGpuReadbackComplete 事件。
  • 你需要使用 TryGetData,而不是在完成的回读上使用 GetData。

有关其他共享细节,请参阅 Unity 关于此功能的文档:

使用 VRCAsyncGpuReadback​

使用 VRCAsyncGpuReadback 时,需要遵循以下 4 个主要步骤:

  1. 设置要使用的数据数组。
  2. 发起 AsyncGpuReadback 请求
  3. 请求完成时接收消息
  4. 从请求中取出数据

Udon 节点图示例​

asyncgpureadback-mu8QGGS.png

UdonSharp 示例​


using UdonSharp;
using UnityEngine;
using VRC.SDK3.Rendering;
​
public class AGPURB : UdonSharpBehaviour
{
public Texture texture;
​
void Start()
{
VRCAsyncGPUReadback.Request(texture, 0, this);
}
​
public void OnAsyncGpuReadbackComplete(VRCAsyncGPUReadbackRequest request)
{
if (request.hasError)
{
Debug.LogError("GPU readback error!");
return;
}
else
{
var px = new Color32[texture.width * texture.height];
Debug.Log("GPU readback success: " + request.TryGetData(px));
Debug.Log("GPU readback data: " + px[0]);
}
}
}