3d XNA中窗口系统的渲染策略(RenderTarget性能)

3d XNA中窗口系统的渲染策略(RenderTarget性能),3d,xna,direct3d,xbox360,3d,Xna,Direct3d,Xbox360,我目前正在从头开始为XNA游戏创建一个窗口系统。我主要是为Windows开发,但谁知道我将来可能支持什么平台呢。如果您知道本机Direct3D的这一点,请随意回答,因为性能语义应该类似。如果可能的话,考虑如果目标平台是Xbox 360,将会发生什么变化。 我正在取得良好的进展,但现在我不确定如何准确地渲染窗口。我提出了四种方法: 只需将所有控件直接渲染到屏幕上即可。这就是我现在所做的。控件可以通过在状态之间混合来设置动画,只要它们不是半透明的。我没有找到一种在任意数量的状态之间设置动画的好方法

我目前正在从头开始为XNA游戏创建一个窗口系统。我主要是为Windows开发,但谁知道我将来可能支持什么平台呢。如果您知道本机Direct3D的这一点,请随意回答,因为性能语义应该类似。如果可能的话,考虑如果目标平台是Xbox 360,将会发生什么变化。 我正在取得良好的进展,但现在我不确定如何准确地渲染窗口。我提出了四种方法:

  • 只需将所有控件直接渲染到屏幕上即可。这就是我现在所做的。控件可以通过在状态之间混合来设置动画,只要它们不是半透明的。我没有找到一种在任意数量的状态之间设置动画的好方法(假设一个按钮当前正在从“按钮向上”到“按钮向下”以及从“鼠标出”到“鼠标移过”进行动画制作,然后该按钮被禁用。该按钮应平滑地从其上一个状态过渡到新状态。使用这种方法,只有在上一个动画完成后播放一个动画时,该方法才有效,否则动画中会出现跳跃

  • 将每个顶级窗口和所有控件渲染到一个渲染目标中,然后使用该目标在屏幕上渲染具有半透明度的顶级窗口。这使得顶级窗口具有半透明度,易于管理,但不会改变动画的效果

  • 将每个控件渲染到渲染目标中,该目标仅在控件变脏(即必须设置动画或文本已更改)时更新。这样,每个控件的半透明度就可以工作

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

下面是实际的问题。任何澄清的问题都是受欢迎的。对于性能问题,请记住这只是游戏的窗口系统-游戏背后可能会使用许多渲染目标并吸收性能,并且可能比窗口系统多得多。假设我们可能有五个顶级窗口,其中有2个在绝对最坏的情况下,屏幕上的每个控件均为0-40

  • 如果有,您会推荐哪种方法?为什么?当然,请随意添加另一种方法
  • 如果每个帧只能渲染其中的20个渲染目标,那么如果只有200或400个渲染目标可用,是否会对性能产生影响
  • PreserveContents对X-Box 360的性能影响真的那么严重吗?对Windows有多严重
  • 可以写入RenderTarget2D.RenderTargetUsage属性。在运行时切换此属性是否是一个好主意,以便仅在需要时启用PreserveContents
  • 你(作为一名玩家)介意控制动画在某些情况下跳跃吗,比如悬停在按钮上,将鼠标移出然后再移入,所以“正常->悬停”动画从一开始就播放两次,因为它比你慢
      • 如果你想通过动画实现这种级别的控制(即,在同一个控件上同时执行多个操作),那么你需要执行多个过程。因此,在着色器中启用此类操作并使用着色器执行多个过程,或者执行标准的“渲染->解析->重新渲染”循环
      • 创建这么多渲染目标确实会对性能造成影响。创建这么多渲染目标不是一个好主意。最好使用较小数量的较大尺寸的渲染目标,并向该目标写入多个控件
      • 我已经很久没有做任何360开发了(bugger:()),但从我的记忆来看,它并没有那么好。除非绝对必要,否则我会避免这个选项。希望有更多最新经验的人能在这里提供帮助
      • 这可能在运行时工作,但可能涉及到幕后的一点工作。我不希望它执行得太好。我确信如果你不在渲染循环中间做这件事,那就没问题了。
      • 我认为那些神经质的动画肯定会很糟糕

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

      只要不超过10MB,从一个渲染目标切换到另一个渲染目标不会产生任何影响,即使使用PreserveContents,因为所有渲染目标都存储在这个特殊内存中

      但是,如果有超过10MB的具有PreserveContents的渲染目标,则必须通过不断将渲染目标切换回正常内存来模拟此属性

      因此,渲染目标的大小不如这些目标的总大小重要。使用以下公式可以知道渲染目标的大小:

      size (bits) = width  x height x color data size (bits)
      
      在Xbox 360上,颜色数据大小为32位,因此,例如,如果您的库用户在HD中开发游戏时,除了主渲染目标之外,没有其他渲染目标,他将使用:

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

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

      Xbox360有10MB的特殊内存用于当前渲染目标。但其他人说了它是如何实现的