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 个主要步骤:
- 设置要使用的数据数组。
- 发起 AsyncGpuReadback 请求
- 请求完成时接收消息
- 从请求中取出数据
Udon 节点图示例

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]);
}
}
}