2008-10-28 38 views
2

我目前从头开始为XNA游戏创建窗口系统。我主要为Windows开发,但谁知道我将来可能支持哪些平台。如果您知道本机Direct3D的这一点,请随时回答,因为性能语义应该相似。如果可能,考虑如果目标平台是X-Box 360,会发生什么变化。XNA中的窗口系统渲染策略(RenderTarget性能)

我正在取得良好进展,但现在我不确定如何准确呈现窗口。我想出了四种方法:

  • 只需将所有控件直接渲染到屏幕上。这就是我现在所做的。只要它们不是半透明的,控件就可以通过状态之间的混合进行动画。我没有找到在任意数量的状态之间进行动画制作的好方法(假设一个按钮目前正在从按钮动画到按钮动画,从鼠标滑过到鼠标滑过,然后它被禁用)。从最后一个状态平滑地融合到新状态,这种方法只适用于最后一个动画完成后播放一个动画,否则你将在动画中跳转。所有的控件都放到一个渲染目标中,然后用它在屏幕上以半透明的方式渲染顶层窗口,这使得顶层工作具有半透明性,并且易于管理,但不会改变动画

  • 将每个控件渲染为rende r目标,它只在控制变脏时更新(即,必须动画或文本已被更改)。这样,每个控件的半透明度就可以工作。

  • 和以前一样,但是除了解决动画问题之外,还有每个控件的第二个渲染目标。每当动画开始时,交换渲染目标,所以我们有动画开始时的状态,并将其与目标状态混合到另一个渲染目标中。这不应该增加以前的方法的开销,我们只有两倍的渲染目标,其中在任何给定帧中只有一个渲染目标(最多)。但问题来了:为了达到这个目的,我需要让“旧”渲染目标保留其内容。这应该能在Windows上获得良好的性能,但似乎对X-Box 360有严重的性能影响。另一方面,只有在动画处于活动状态时才需要“保留”位。

这里来了实际的问题。任何澄清的事情都是值得欢迎的。考虑到性能问题,请记住,这只是游戏的窗口系统 - 背后的游戏可能会使用许多渲染目标并吸取性能,而且可能比窗口系统要多得多。假设我们可能在绝对最差的情况下在屏幕上有五个顶级窗口,每个窗口都有20-40个控件。

  • 您会推荐哪些方法,如果有的话,为什么?当然,请随意添加另一种方法。
  • 如果让我们说200或400个渲染目标可用,那么是否会对性能产生影响?假设只有20个渲染目标可以渲染到每个帧?
  • PreserveContents对X-Box 360的性能影响真的很差吗? Windows有多糟糕?
  • 可以写入RenderTarget2D.RenderTargetUsage属性。在运行时切换这是一个好主意,仅在需要时启用PreserveContents?
  • 请问你(作为球员)心若控制动画会跳在某些情况下,像盘旋在一个按钮,出来,然后移动鼠标再次,所以“正 - >悬停”动画从头开始播放两次因为它比你慢?

回答

3
  • 如果你想与动画控制(即具有多一次回事同一控制)的该级别,那么你就要有做多遍。因此,在着色器中启用这种类型的东西,并使用着色器进行多次传递,或者执行标准的Render-> Resolve-> Rerender循环。
  • 创建许多rendertargets确实有一个性能问题。创造这么多不是一个好主意。您最好拥有较小数量的更大尺寸的渲染目标,并为该目标编写多个控件。
  • 它一直年龄,因为我没有任何360 DEV(开溜:(),但是从我可以rememeber,这不是真的很大。我会避免这个选项,除非绝对必要的。希望有人与更多的最新经验,可以在这里帮助。
  • 这可能会在运行时正常工作,但可能涉及幕后工作的公平一点。我不会期望,要执行太清楚了。我敢肯定,这很好,如果你不是在做渲染循环的中间。
  • 我觉得心惊肉跳动画肯定会吸。恕我直言:)
+0

感谢您的输入。我没有想法将多个控件渲染成一个大的渲染目标,尽管现在你说这看起来很明显。当我有空时,我会更深入地看待这一点,然后很可能会接受你的答案。 – OregonGhost 2008-12-09 12:56:09

4

如果你正在为Xbox 360开发,你一定要小心渲染目标。 Xbox 360有一个特殊的内存(10MB)来保存渲染目标,包括用于在屏幕上渲染的渲染目标。

只要不超过10MB,从一个切换渲染目标到另一个没有任何影响,即使有PreserveContents,因为所有的渲染目标都存储在这个特殊的记忆。

但是,当你有超过渲染PreserveContents目标10MB以上,这个属性必须通过不断切换渲染目标回正常记忆效仿。

所以渲染目标的数量并不像那些渲染目标的总数那么重要。你可以知道一个渲染目标与这个公式大小:

size (bits) = width x height x color data size (bits) 

颜色数据大小是在Xbox 360上32位的话,作为一个例子,如果你的库的用户正在开发自己的游戏,高清只有没有其他的渲染目标比主之一,他将使用:

3,515625MB = 29491200 bits = 1280 x 760 x 32 bits 

此外,应避免创建动态渲染目标。它花费太多。您应该在游戏开始时创建一个静态渲染目标池并让您的GUI组件请求它们。

+0

感谢您的输入。渲染目标池是一个有趣的想法。我实际上并没有为Xbox 360开发,我只是不想排除这个选项。渲染目标的10 MB似乎并不多。这几乎满1080p的屏幕。 – OregonGhost 2009-07-16 09:00:02

+0

是的,它非常有限。您可以认为具有10MB以上的渲染目标,但更新超过10MB的渲染目标时,每个滴答开始花费CPU时间。 – Jodi 2009-07-19 00:55:40

1

Xbox360上有用于当前渲染目标的特殊10MB内存。但其余的人谈到它的工作原理并不准确。无论使用什么渲染目标,都会占用10MB的空间。否则,您可以拥有任意数量的渲染目标。如果您的渲染目标比10MB大(1280×720像一些AA多重采样是),那么XBOX360采用了一种名为预测平铺技术:http://msdn.microsoft.com/en-us/library/bb464139.aspx

我顺利进入编写一个窗口系统。我将窗口部件渲染到渲染目标,然后将窗口部件目标渲染到窗口目标,将窗口目标渲染到后端缓冲区。这使我可以轻松地添加滚动条并仅将部分渲染目标渲染到窗口渲染目标上。如果有更好的方法来处理滚动窗口内容的工作让我知道。不知道这是否是最好的表现。