XNA何时丢弃渲染目标的内容?

3
我知道XNA中的渲染目标是不稳定的,但它们有多不稳定?我找不到任何文档说明它们的内容何时被丢弃。是只有在开始绘制它们时才会被丢弃,还是可以在任何时候被丢弃?
我想简单地绘制一次渲染目标,然后无限期地将其用作Texture2D。这可能吗?我需要启用RenderTargetUsage.PreserveContents才能正常工作吗?我已经阅读了保留内容对Xbox和手机硬件非常慢的信息。
2个回答

7
乔纳森已经对RenderTargetUsage进行了很好的解释,但是我想澄清一些关于使用RenderTarget2D作为Texture2D的原始问题的事情:
简单来说,RenderTargetUsage控制表面在被设置为设备渲染目标时的行为。如果它没有设置为保留内容,那么它们将被清除。在Xbox 360上,这是硬件的一个怪癖(为了提高性能)。在Windows上,为了与Xbox 360匹配,当你设置它时,它会被清除。
但是,如果您将其用作纹理,则这无关紧要。只有当您想要多次将其渲染到一个表面(每次将其设置为设备)而不失去以前的内容时,才会出现问题。
如果您只在游戏开始时将其设置为渲染目标一次,那么保留设置无论如何都无关紧要,因为它永远不会再次被设置为渲染目标。
你需要关注的是IsContentLost属性(MSDN)或者ContentLost事件(MSDN),如果你所渲染到的渲染目标丢失了内容(比如全屏切换等设备变化),这些属性将被设置/触发。如果你每帧重新渲染渲染目标,那么你不需要检查内容是否丢失。但如果你希望在游戏开始时创建渲染目标并继续使用它们,你需要确保它们在创建后的帧中没有丢失。(请注意,你不需要担心内容丢失发生在Draw调用的过程中。我相信它只会在帧之间发生。)

4
首先,关于 RenderTargetUsage.PreserveContents,你的理解是正确的。在某些硬件上(至少在XBox上),存在一些限制,防止它本地保存后备缓冲区的内容,这意味着需要在可能出现丢弃之前将其复制到系统RAM中,并在之后将其复制回来。
当一个缓冲区被设置为活动渲染目标时,缓冲区的内容会被丢弃。这意味着在翻转之后(如果它是您的主要翻转链的一部分,在每个绘图循环的结束处)或者在将其设置为其中一个活动渲染目标之后,它们会被丢弃。
如果您有疑问,请在开发应用程序时安装DirectX开发人员运行时(这是任何DirectX SDK软件包的一部分),因为该选项可以强制清除后备缓冲区(因为在PC平台上,即使没有设置PreserveContents,也不能保证清除后备缓冲区)。

谢谢。所以,如果您只渲染一次到目标,然后将其用作普通纹理,它就不应该被丢弃,对吗? - Tim R.
1
我会进行实验,虽然有很多规则;但从我的PC实验(没有开发者运行时)来看是这样的情况。 - Jonathan Dickinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接