2012-10-06 82 views
1

我有一个程序首先渲染纹理,然后将纹理传递给计算着色器进行处理,然后通过纹理全屏四边形将输出结果渲染到屏幕上。GPU上下文切换

我读过nVidia的计算着色器编程指南,每次调度计算着色器时,它都会启动一个GPU设备上下文切换,这种切换不应该经常进行。

我现在很困惑。我看到它的方式,在我的渲染管线中,GPU切换两次上下文。对?在第一次发送呼叫期间,下一次正常显示我的全屏四倍频时。

如果这是正确的,那么我可以通过重组我的代码来避免一个开关。首先,渲染一个纹理。其次,在计算着色器上进行处理。然后,在下一帧,渲染结果,然后(仍然在下一帧)渲染纹理的所有更新,在计算着色器上进行处理...因此,基本上每一帧的起始都会渲染最后一帧的结果(第一帧将是一个例外)。那么只会有一个上下文切换,对吧?

但是,GPU仍然需要在帧之间进行上下文切换,对吧?所以我的渲染管道的两个版本都有两个上下文切换。性能没有差别。我对么?

任何帮助,将不胜感激。

回答

1

上下文切换引入了一个小命中,但在你的情况下,它可以忽略不计,所以你可以安全地在同一帧中多次计算和渲染管线之间切换,而无需担心。

在很多现代游戏中,同一管道中有两个以上的开关(渲染的图形管道,光线的计算着色器,fxaa的pixelshader ...),它们仍然运行良好。

+0

谢谢。这清除了我对表现的担忧。然而,我的代码的两个版本呢,它们是一样的吗? – l3utterfly

+0

性能方面他们几乎是一样的,你仍然需要切换,它会让你的管道更加复杂以获得最小的收益imo(还记得设备上下文调用是非阻塞的,所以你的命令很可能是当你调用当前的方法时执行,而不是当你调用dispatch或draw时) – catflier