我知道XNA中的渲染目标是不稳定的,但它们有多么不稳定?我找不到任何文档告诉何时其内容被丢弃。是在你开始吸引他们的时候,还是可以在任何时候??
我想简单地绘制一个渲染目标,然后无限期地将其用作Texture2D。这可能吗?我是否需要启用RenderTargetUsage.PreserveContents
才能使其正常工作?我已经读过PreserveContents在Xbox和手机硬件上非常慢。
答案 0 :(得分:7)
Jonathan对RenderTargetUsage
做了很好的解释,但我想澄清一些关于原始问题的事情,涉及使用RenderTarget2D
作为Texture2D
:
简单地说,RenderTargetUsage
控制表面在设备上设置为渲染目标时的行为。如果未将其设置为保留内容,则会将其清除。在Xbox 360上,这恰好是硬件的一个怪癖(性能)。在Windows上,只需在设置时清除表面即可模拟匹配Xbox 360。
但是,如果你将它用作纹理,这是无关紧要的。当你想要多次渲染到一个表面(每次都设置到设备)时,这只是一个问题而没有失去以前的内容。
如果你只将它设置为渲染目标一次,在游戏开始时,保留设置是什么并不重要,因为它永远不会再被设置为渲染目标。
您关注的是 IsContentLost
属性(MSDN)或ContentLost
事件(MSDN)。如果您渲染到渲染目标的内容丢失(由于设备更改,例如:全屏显示),将设置/引发这些内容。
如果您每帧重新渲染渲染目标,则无需检查内容丢失。但是,如果您希望在游戏开始时创建渲染目标并在整个过程中继续使用它们,则需要确保它们在创建它们的帧之后没有丢失。
(请注意,您无需担心通过Draw
电话中途发生内容丢失的情况。我有理由相信它只能在帧之间发生。)
答案 1 :(得分:4)
首先,关于RenderTargetUsage.PreserveContents
你的阅读是正确的。有一些硬件限制(至少在XBox上)阻止它本地保留后端缓冲区的内容,这意味着它需要在发生可能的丢弃之前复制到系统RAM中并在之后复制回来。
将缓冲区的内容设置为活动渲染目标时,将丢弃缓冲区的内容。这意味着它们在翻转后被丢弃(如果它是主翻转链的一部分,在每个Draw循环结束时)或者将其设置为活动渲染目标之一。
如果您有疑问,请在开发应用程序时安装DirectX开发人员运行时(这是任何DirectX SDK package的一部分) - 这有一个强制清除后台缓冲区的选项(因为在PC平台上不支持缓冲区)被丢弃,即使没有设置PreserveContents)。