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

2024-05-24

我目前正在从头开始为 XNA 游戏创建一个窗口系统。我主要针对 Windows 进行开发,但谁知道我将来可能支持哪些平台。如果您知道本机 Direct3D 的这一点,请随意回答,因为性能语义应该类似。如果可能,请考虑如果目标平台是 X-Box 360 会发生什么变化。

我取得了很好的进展,但现在我不确定如何准确渲染窗口。我想出了四种方法:

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

  • 将每个顶级窗口和所有控件渲染到渲染目标中,然后使用它以半透明的方式将顶级窗口渲染到屏幕上。这使得顶层工作半透明并且易于管理,但不会改变动画的情况。

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

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

真正的问题来了。任何澄清的内容都是受欢迎的。对于性能问题,请记住,这只是游戏的窗口系统 - 后面的游戏可能会使用许多渲染目标并也会降低性能,而且可能比窗口系统还要多。假设在绝对最坏的情况下,我们可能有 5 个顶级窗口,每个窗口在屏幕上有 20-40 个控件。

  • 您会推荐其中哪种方法(如果有)?为什么?当然,请随意添加另一种方法。
  • 如果只有 200 或 400 个可用渲染目标,并且每帧中可能只有 20 个渲染目标,那么是否会对性能产生影响?
  • PreserveContents 对 X-Box 360 的性能影响真的那么严重吗? Windows 上的情况有多糟糕?
  • 可以写入 RenderTarget2D.RenderTargetUsage 属性。在运行时切换此选项以仅根据需要启用 PreserveContents 是一个好主意吗?
  • 您(作为玩家)是否介意控制动画在某些情况下会跳跃,例如将鼠标悬停在按钮上,将鼠标移出然后再次移入,因此“正常->悬停”动画从一开始就播放两次,因为它是比你慢?

如果您正在为 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 组件请求它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XNA中窗口系统的渲染策略(RenderTarget性能) 的相关文章

  • 将按钮控件嵌入到现有 Direct3D 应用程序中

    我想将自己的内容覆盖在 Direct3D v9 游戏 由第三方制作 之上 叠加互动按钮 具体来说 我想覆盖一个可点击的按钮控件 就像 Steam 所做的那样 尽管我正在尝试一个更简单的界面 理想情况下 我能够覆盖 WPF 按钮或 Windo
  • Windows Phone 自定义着色器错误?

    在 Windows Phone XNA 4 0 中 我在编译时收到以下错误 Windows Phone平台不支持自定义着色器 这真的很烦人 因为我有一个 Xbox 360 版本的项目 还有一个 Windows 版本的项目 我尝试使用基于编译
  • 使用 Scipy/Numpy 在浊点的二维插值中仅获取“有效”点

    我有一个通过人的背部摄影测量获得的浊点 我正在尝试对其进行插值以获得规则网格 为此我正在使用scipy interpolate到目前为止取得了良好的成果 问题是 我正在使用的函数 scipy interpolate griddata 使用平
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • 如何在 C# + XNA 中将音调更改为超过 1 或 -1?

    我需要拥有比 2 个八度音阶更多的自由来创建我想要的东西 但 XNA 却做不到 我确实意识到可能没有办法让程序接受更大 更小的值 但是有没有办法解决它 就像以最低音调发出声音 然后创建一个新的声音 这样我就可以降低它更多 None
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 无法使用 vcglib 简化 3D 模型,断言“0”失败

    I used vcglib https github com cnr isti vclab vcglib简化 3D 模型文件 我使用了 master a8e87662 git 存储库 我运行示例 trimesh clustering htt
  • 在 iOS 上的 SceneKit 中导入 3d 模型

    从 URL 导入 obj 文件并将其转换为 SCNNode 时遇到问题 这是代码 swift3 let url URL init string https cloud box com shared static ock9d81kakj91d
  • 使用开源 3D 引擎从 Openstreetmap 数据渲染地图? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从 Openstreetmap 数据渲染 3D 地图可能会很漂亮麻烦的 https gis stack
  • 在 Unity 中平滑动态生成的网格?

    给定 Unity 和 C 中的网格 其本身是通过合并更简单的基础网格实时创建的 我们如何在运行时 将其变成平滑的 几乎像包裹在布中的网格版本一样 不是完全凸出的版本 而是更圆润 软化锋利的边缘 桥接深间隙等 理想情况下 表面也将像 平滑角度
  • 求截头棱锥体/截棱锥体横截面的边长

    如何找到横截面的边长 如图所示 下图 横截面 红色 截头锥体 截棱锥体 我知道顶部和底部的边长 以及底部的高度 截锥体和到横截面的距离 此外我还知道 顶部和底部底座平行 并且顶部和底部的中心 底部底座直接位于彼此之上 比例是线性的 因此只需
  • 计算任意网格的平面 UV 坐标

    我有从二维形状生成三角形网格的代码 因为在大多数情况下 这些形状在表面上的顶点分布不均匀 所以我在生成 UV 时遇到了问题 这样就不会导致纹理扭曲 任何人都可以推荐一些讨论平面网格上 UV 计算技术的文章 书籍 代码示例吗 谢谢 好的 让我
  • Java 的 3D 场景图库?

    我正在寻找一个可靠的 Java 3D 场景图 API 它具有良好的文档 活跃的社区和允许商业使用的许可证 我排除了com sun scenegraph https scenegraph dev java net 因为它是 GPL 而且看起来
  • 如果我每次创建粒子时都强制重新初始化每个粒子,我是否应该使用粒子池

    我正在 XNA4 中创建一个粒子系统 但遇到了问题 我的第一个粒子系统是一个简单的粒子列表 其实例是在需要时创建的 但后来我读到了有关使用池的内容 我的第二个系统由一个充满粒子的池和一个发射器 控制器组成 我的池非常基本 这是代码 clas
  • 将渲染后效果应用于 XNA 中的 SpriteBatch

    在 XNA 框架中 有没有一种方法可以使用典型的 SpriteBatch 方法渲染 2D 场景 然后在渲染该帧后将效果应用于整个图像 例如 模糊 棕褐色甚至使整个事情看起来像旧电影胶片 带有颗粒 灰尘 线条等 是的 您要做的就是将渲染目标设

随机推荐

  • Docker 端口未映射

    如果这很明显 我很抱歉 但我很难从主机上的容器外部访问 Docker 化服务器 这就是我正在做的 我使用以下命令运行容器 docker run it rm name aurelia dev p 8888 8080 v Users tersk
  • 仅适用于 Firefox 的不同字体大小

    我只是为我的网站添加一个帐户标题 仅显示玩家的用户名 我正在使用自定义字体 它在 Chrome 和 IE 上运行良好 但是对于 Firefox 它不显示自定义字体 只显示下一个可用字体 即 Verdana 我不介意 但我的问题是 Verda
  • 如何防止 VC++ 9 链接器链接不必要的全局变量?

    我正在玩功能级链接 http msdn microsoft com en us library xsa71f43 VS 80 aspx在VC 中 我已启用 OPT REF 和 OPT ICF http msdn microsoft com
  • 在webview android上显示网页的一部分

    我想制作一个将网页内容加载到 webview 中的应用程序 我只想显示整个网页视图中的特定内容 而不是网页的全部内容 这是一个例子 如果我使用 作为 webview 的 URL 它会加载 webview 上页面的所有内容 但我想删除页面的横
  • 使用 posix_spawn 启动进程

    我正在使用以下代码在 Linux 中启动新进程 pid t processID char argV 192 168 1 40 char 0 int status 1 status posix spawn processID home use
  • 如何在应用程序中从 Xcode 的“支持文件”组访问文件?

    我有一个应用程序 现在我几乎已经完成了 在数据输入流程结束时发送电子邮件 发送两个 pdf 文件 其中一个是根据输入的数据生成的 另一个是静态文件 在每个实例中都相同 第一个 pdf 生成正常 它已保存到应用程序的 文档 文件夹中 并且我已
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • VBA 按用户范围选择排序

    在过去的三天里我一直在为这个问题苦苦挣扎 所以请帮忙 我想做的是当我运行 Macro1 时 为了论证 将弹出窗口以选择应排序的单元格范围 通过选择的最后一列 或第五列 对这些进行排序 从最低数字到最高数字 这里的问题是所选区域每次都会改变
  • 无法单步执行远程 SQL Server 2008 上的存储过程

    我在虚拟上安装了一个域控制器Windows Server 2008 x64 SQL Server 2008 Express x64正在运行Windows Server 2008 x64和客户端Windows 7 RTM x86 两者都已加入
  • NumPy 或 SciPy 计算加权中位数

    我正在尝试自动化 JMP 执行的流程 分析 gt 分布 输入 A 列作为 Y 值 使用后续列 作为 权重 值 在 JMP 中 您必须一次执行一列 我想使用 Python 循环所有列并创建一个数组 显示每列的中位数 例如 如果质量数组为 0
  • Javascript:函数的“无限”参数?

    在 Chrome 中 当我输入console log在下面的一项中 console log A parameter A parameter A parameter A parameter A parameter A parameter A
  • 查找导航属性的相关 FK 属性

    在运行时 我想查找 EntityObject 是否也具有给定 NavigationProperty 的外键属性 我在下面的两个步骤中做到了这一点 我想这将需要一些元数据查询 我不确定如何测试元数据类是否指向特定 EntityObject 类
  • 检索用户关注的所有用户的帖子 -rails -ActiveRecord

    我有一个简单的 Rails 应用程序 用户可以在其中互相赠送虚拟礼物 每件礼物都属于两个用户 赠送者和接收者 In my User rb has many given gifts class name Gift foreign key gi
  • 如何使第一行变成第二级MultiIndex

    我有一个现有的 DataFrame 如下所示 1 1 1 2 2 2 2 abc def ghi jkl mno pqr stu 1 00 2 00 3 00 4 00 5 00 6 00 7 00 1 00 2 00 3 00 4 00
  • 何时计划 (SELECT) 查询?

    在 PostgreSQL 中 什么时候计划 SELECT 查询 Is it 在报表准备时 或者 在处理 SELECT 开始时 或者 别的东西 我问的原因是 Stackoverflow 上有一个问题 相同的查询 两种不同的方式 性能截然不同
  • 同时运行 ng build --watch 和 ngserve 时,Angular 7 库 html 模板更改不会影响应用程序

    当 Angular 7 库 html 模板更改使用 ng build library watch 和 ngserve application 在不同的 cmd 中同时运行时 不会影响 Angular 应用程序 所以我首先使用 watch 标
  • 在 C++20 中获取当前日期/时间是线程安全的吗?

    简短的问题 在 C 17 之前 包括 C 17 C 不提供线程安全的方式来获取当前时间或日期 这个问题会在 C 20 中修复吗 长问题 获取当前时间和日期的唯一可移植方法是使用 std gmtime 或 std localtime 函数 这
  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • Shell Crontab 不工作

    GNU nano 2 0 9 文件 tmp crontab XXXXzBQgwS 5 check phpfpm sh 5 check nginx sh 5 disk clean sh 5 loadcheck sh 按理说我的代码应该每 5
  • XNA中窗口系统的渲染策略(RenderTarget性能)

    我目前正在从头开始为 XNA 游戏创建一个窗口系统 我主要针对 Windows 进行开发 但谁知道我将来可能支持哪些平台 如果您知道本机 Direct3D 的这一点 请随意回答 因为性能语义应该类似 如果可能 请考虑如果目标平台是 X Bo