我目前从头开始为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?
- 请问你(作为球员)心若控制动画会跳在某些情况下,像盘旋在一个按钮,出来,然后移动鼠标再次,所以“正 - >悬停”动画从头开始播放两次因为它比你慢?
感谢您的输入。我没有想法将多个控件渲染成一个大的渲染目标,尽管现在你说这看起来很明显。当我有空时,我会更深入地看待这一点,然后很可能会接受你的答案。 – OregonGhost 2008-12-09 12:56:09