3d XNA中窗口系统的渲染策略(RenderTarget性能)
我目前正在从头开始为XNA游戏创建一个窗口系统。我主要是为Windows开发,但谁知道我将来可能支持什么平台呢。如果您知道本机Direct3D的这一点,请随意回答,因为性能语义应该类似。如果可能的话,考虑如果目标平台是Xbox 360,将会发生什么变化。 我正在取得良好的进展,但现在我不确定如何准确地渲染窗口。我提出了四种方法:3d XNA中窗口系统的渲染策略(RenderTarget性能),3d,xna,direct3d,xbox360,3d,Xna,Direct3d,Xbox360,我目前正在从头开始为XNA游戏创建一个窗口系统。我主要是为Windows开发,但谁知道我将来可能支持什么平台呢。如果您知道本机Direct3D的这一点,请随意回答,因为性能语义应该类似。如果可能的话,考虑如果目标平台是Xbox 360,将会发生什么变化。 我正在取得良好的进展,但现在我不确定如何准确地渲染窗口。我提出了四种方法: 只需将所有控件直接渲染到屏幕上即可。这就是我现在所做的。控件可以通过在状态之间混合来设置动画,只要它们不是半透明的。我没有找到一种在任意数量的状态之间设置动画的好方法
- 只需将所有控件直接渲染到屏幕上即可。这就是我现在所做的。控件可以通过在状态之间混合来设置动画,只要它们不是半透明的。我没有找到一种在任意数量的状态之间设置动画的好方法(假设一个按钮当前正在从“按钮向上”到“按钮向下”以及从“鼠标出”到“鼠标移过”进行动画制作,然后该按钮被禁用。该按钮应平滑地从其上一个状态过渡到新状态。使用这种方法,只有在上一个动画完成后播放一个动画时,该方法才有效,否则动画中会出现跳跃
- 将每个顶级窗口和所有控件渲染到一个渲染目标中,然后使用该目标在屏幕上渲染具有半透明度的顶级窗口。这使得顶级窗口具有半透明度,易于管理,但不会改变动画的效果
- 将每个控件渲染到渲染目标中,该目标仅在控件变脏(即必须设置动画或文本已更改)时更新。这样,每个控件的半透明度就可以工作
- 与前一个一样,但除了解决动画问题外,每个控件都有一个第二个渲染目标。每当动画开始时,交换渲染目标,这样我们就有了动画开始时的状态,并将其与目标状态混合到另一个渲染目标中。这不应该比前一个方法增加开销,我们ust有两倍多的渲染目标,在任何给定帧中,只有一个渲染目标(最多)。但问题来了:要使其工作,我需要使用“旧的”渲染目标保留其内容。这在Windows上应具有良好的性能,但似乎对X-Box 360的性能有严重影响。另一方面,“保留”位仅在动画处于活动状态时才有必要
- 如果有,您会推荐哪种方法?为什么?当然,请随意添加另一种方法
- 如果每个帧只能渲染其中的20个渲染目标,那么如果只有200或400个渲染目标可用,是否会对性能产生影响
- PreserveContents对X-Box 360的性能影响真的那么严重吗?对Windows有多严重
- 可以写入RenderTarget2D.RenderTargetUsage属性。在运行时切换此属性是否是一个好主意,以便仅在需要时启用PreserveContents
- 你(作为一名玩家)介意控制动画在某些情况下跳跃吗,比如悬停在按钮上,将鼠标移出然后再移入,所以“正常->悬停”动画从一开始就播放两次,因为它比你慢
- 如果你想通过动画实现这种级别的控制(即,在同一个控件上同时执行多个操作),那么你需要执行多个过程。因此,在着色器中启用此类操作并使用着色器执行多个过程,或者执行标准的“渲染->解析->重新渲染”循环
- 创建这么多渲染目标确实会对性能造成影响。创建这么多渲染目标不是一个好主意。最好使用较小数量的较大尺寸的渲染目标,并向该目标写入多个控件
- 我已经很久没有做任何360开发了(bugger:()),但从我的记忆来看,它并没有那么好。除非绝对必要,否则我会避免这个选项。希望有更多最新经验的人能在这里提供帮助
- 这可能在运行时工作,但可能涉及到幕后的一点工作。我不希望它执行得太好。我确信如果你不在渲染循环中间做这件事,那就没问题了。
- 我认为那些神经质的动画肯定会很糟糕
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的特殊内存用于当前渲染目标。但其他人说了它是如何实现的