3

我知道 XNA 中的渲染目标是易变的,但它们的易变程度如何?我找不到任何说明何时丢弃其内容的文档。是在你开始向他们画画的时候,还是可以在任何时候?

我想简单地绘制一次渲染目标,然后无限期地将其用作 Texture2D。这可能吗?我需要启用RenderTargetUsage.PreserveContents它才能正常工作吗?我读过 PreserveContents 在 Xbox 和手机硬件上非常慢。

4

2 回答 2

7

乔纳森对 进行了很好的解释RenderTargetUsage,但我想澄清一些关于原始问题的事情,包括使用 aRenderTarget2D作为 a Texture2D

简而言之,RenderTargetUsage控制表面在设备上设置为渲染目标时的行为。如果没有设置为保留内容,它们将被清除。在 Xbox 360 上,这是硬件的一个怪癖(为了性能)。在 Windows 上,通过在设置它时简单地清除表面来模拟它以匹配 Xbox 360。

但是,如果您将其用作纹理,则无关紧要。只有当您想要多次渲染到一个表面(每次将其设置到设备)而不丢失以前的内容时,这才是一个问题。

如果您只将其设置为渲染目标一次,那么在游戏开始时,保留设置是什么无关紧要,因为它再也不会被设置为渲染目标。

您关心的是属性IsContentLost( MSDN ) 或ContentLost事件 ( MSDN )。如果您渲染到渲染目标的内容丢失(由于设备更改,例如:全屏显示),这些将被设置/引发。

如果您在每一帧都重新渲染渲染目标,那么您不需要检查内容丢失。但是,如果您希望在游戏开始时创建渲染目标并在整个过程中继续使用它们,则需要确保它们在创建它们的帧之后没有丢失。

(请注意,您无需担心在Draw通话过程中会发生内容丢失。我有理由确定它只能在帧之间发生。)

于 2011-08-01T14:51:11.940 回答
4

首先,关于RenderTargetUsage.PreserveContents你的阅读是正确的。有一些硬件限制(至少在 XBox 上)阻止它本机保留后台缓冲区的内容,这意味着需要在可能的丢弃发生之前将其复制到系统 RAM 中,然后再复制回来。

当缓冲区设置为活动渲染目标时,缓冲区的内容将被丢弃。这意味着它们在翻转后被丢弃(如果它是主翻转链的一部分,则在每个 Draw 循环结束时)或当您将其设置为活动渲染目标之一时。

如果您对在开发应用程序时安装 DirectX 开发人员运行时有疑问(它是任何DirectX SDK 包的一部分) - 这有一个强制清除后台缓冲区的选项(因为在 PC 平台上,后台缓冲区不能保证被丢弃,即使如果 PreserveContents 未设置)。

于 2011-08-01T11:51:51.543 回答