写入RenderTarget后,如何高效克隆输出?

2023-11-23

XNA菜鸟在这里,每天都在学习。我刚刚弄清楚如何使用 RenderTarget2D 将多个纹理合成为一个。然而,虽然我可以将 RenderTarget2D 用作 Texture2D 来满足大多数用途,但有一个关键的区别:当调整后缓冲区大小时,这些渲染的纹理会丢失(毫无疑问在其他情况下,例如图形设备内存不足)。

目前,我只是将完成的 RenderTarget2D 复制到新的非易失性 Texture2D 对象中。不过,我这样做的代码非常丑陋。有没有更优雅的方法来做到这一点?也许我只是累了,但我在谷歌或SO上找不到答案。

稍微简化一下:

public static Texture2D  MergeTextures(int width, int height, IEnumerable<Tuple<Texture2D, Color>> textures)
    {
    RenderTarget2D  buffer = new RenderTarget2D(_device, width, height);

    _device.SetRenderTarget(buffer);
    _device.Clear(Color.Transparent);

    SpriteBatch  spriteBatch = new SpriteBatch(_device);
    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);

    // Paint each texture over the one before, in the appropriate color
    Rectangle  rectangle = new Rectangle(0, 0, width, height);
    foreach (Tuple<Texture2D, Color> texture in textures)
        spriteBatch.Draw(texture.Item1, rectangle, texture.Item2);

    spriteBatch.End();
    _device.SetRenderTarget((RenderTarget2D)null);

    // Write the merged texture to a Texture2D, so we don't lose it when resizing the back buffer
    // This is POWERFUL ugly code, and probably terribly, terribly slow
    Texture2D  mergedTexture = new Texture2D(_device, width, height);
    Color[]    content       = new Color[width * height];
    buffer.GetData<Color>(content);
    mergedTexture.SetData<Color>(content);
    return mergedTexture;
    }

我想我should检查 IsContentLost 并根据需要重新渲染,但这发生在我的主绘图循环的中间,当然你不能嵌套 SpriteBatches。我可以维护一个“渲染 TODO”列表,在主 SpriteBatch 结束后处理这些列表,然后它们可用于下一帧。这是首选策略吗?

该代码仅被调用几次,因此性能不是问题,但我想学习如何正确地做事。


实际上,如果您在正常加载内容(游戏开始、关卡更改、房间更改等)时在一次性过程中生成纹理,那么您的代码并没有那么糟糕。您正在 CPU 和 GPU 之间传输纹理,这与加载普通纹理相同。这很简单而且有效!

如果您更频繁地生成纹理,并且它开始成为每帧成本,而不是加载时间成本,那么您将需要担心其性能,并可能将它们保留为渲染目标。

你不应该得到ContentLost在绘图过程中,因此您可以安全地响应该事件并重新创建渲染目标。或者您可以检查IsContentLost在它们中的每一个上,最好在渲染其他任何内容之前在帧的开始处。不管怎样,在你之前应该检查一切SpriteBatch begins.

(通常,当使用渲染目标时,无论如何,您都会在每一帧重新生成它们,因此在这种情况下您不需要检查它们。)

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

写入RenderTarget后,如何高效克隆输出? 的相关文章

随机推荐

  • 如何在调试 MSVC ABI Rust 程序时检查变量值?

    我已经下载了 Rust 1 7 0 的 MSVC ABI 版本 并按照文档中的猜谜游戏部分进行操作 我注意到构建使用本机工具链 在我的例子中为 Visual Studio 2015 Update 2 因此生成可由本机调试器 例如 WinDB
  • .NET 应用程序到 Mac OS X 应用程序?

    有没有办法将 NET 应用程序转换为 Mac OS X 应用程序 我正在使用 Visual Basic 2008 并且我希望 Mac 用户也使用我的应用程序 是否可以 如果是这样 请回复并提供链接或来源 答案很大程度上取决于您想要做什么 T
  • “AWSCognito”未定义

    我已经使用以下示例在 nodeJS 中实现 AWS Cognito 但我遇到了错误 AWSCognito 未定义为 no undef 参考链接 https github com aws amazon cognito identity js
  • 如何在 matplotlib 中制作分组箱线图

    我有三种算法 A B 和 C 我已经在不同的数据集上运行它们 并且希望将它们在每个数据集上的运行时间绘制为 Python 中的分组箱线图 作为我想要的视觉示例 我画了一幅糟糕的图 但希望它能表达要点 如果我的 python 数据如下所示 i
  • 无法安装 Docker - 哈希和不匹配(Ubuntu 18.04、Vagrant、Virtualbox)

    我只是无法在 Ubuntu 18 04 的新映像中安装 Docker 在 Virtualbox 中 使用 Vagrant 我正在使用官方网站的说明 https docs docker com install linux docker ce
  • 使用 SFTP 将文件从远程服务器直接复制到 Azure Blob 存储

    我有一个带有一堆静态文件的远程服务器 在Azure之外 我已在 Azure 中创建了辅助角色 并且希望使用该辅助角色通过 SFTP 将这些文件从远程服务器直接传输到我的 Blob 存储帐户 无需在本地复制到辅助角色 是否有关于如何做到这一点
  • JAXB 解组错误:预期元素为 <{ } Root>

    我正在重用其他地方生成的现有对象来解组以 String 类型传入的 XML 数据 物体 3 import java util ArrayList 4 import java util List 5 import javax xml bind
  • SQLite3 和多重处理

    我注意到当我在多处理环境中使用 sqlite3 时 它并不真正有能力也不可靠 每个进程都尝试将一些数据写入同一个数据库 以便一个连接被多个线程使用 我使用 check same thread False 选项进行了尝试 但插入的数量非常随机
  • 为什么javascript在迭代时将数组索引转换为字符串?

    这个 Javascript 逻辑让我困惑 我正在创建一个数组并将其第一个元素设置为数字 当我使用 for 循环对其进行交互时 Javascript 将数组键转换为字符串 为什么 我希望它保留一个数字 stuff stuff 0 3 for
  • PHP 电子邮件发送 BCC

    我知道有一些类似的问题 但我就是无法让它发挥作用 好的 我有一个从数据库中抓取的电子邮件列表 位于名为 emailList 的变量中 如果我将变量放入 我可以获取从表单发送电子邮件的代码 to节但是 我无法让它与密件抄送一起使用 我什至添加
  • 如何在 powershell 3 中将单个 txt 文件移动到 zip

    我正在尝试将一个文本文件复制 移动到 zip 文件 我不想解压它 复制文件并将其压缩回来 有什么方法可以直接将文本文件复制或移动到 powershell 中的 zip 中吗 当我在 powershell 中执行此操作时 当我尝试查看 zip
  • C++ Win32 未在 WM_DEVICECHANGE 上接收 DBT_DEVICEARRIVAL 或 DBT_DEVICEREMOVECOMPLETE

    我一直致力于检测 USB 插入 拔出 我已经使用 CreateWindowEx 实现了代码 并通过我的窗口进程回调传递了 WNCLASSEX 在插入和移除 USB 时 我成功收到 WM DEVICECHANGE 消息 但 wParam 始终
  • 如何将 JavaScript 变量“输出”到 HTML div 中

    我有一个 JavaScript 变量 我希望 HTML div 输出 7 我知道这很简单 但我似乎无法理解这一点 div Have 7 output here div 为 div 指定一个特定的 id 例如 div div 现在使用以下 J
  • 向上导航(操作栏的后箭头)不适用于片段

    我将抽屉布局作为我的活动的基本布局 并且我正在替换此抽屉布局内框架上的两个片段 第一个片段不会添加到片段的返回堆栈中 我在我的活动中显示汉堡包图标 我也希望在我的第一个片段中显示抽屉菜单 在第二个片段中 我禁用了汉堡包图标mActionBa
  • 是否可以使用输入值属性作为 CSS 选择器?

    是否可以使用 CSS 选择器来定位具有特定值的输入 示例 如何根据以下内容定位以下输入value United States
  • 使用 py2exe 捆绑 GTK 资源

    我正在使用 Python 2 6 和 PyGTK 2 22 6一体化安装程序在 Windows XP 上 尝试构建一个单文件可执行文件 通过py2exe 对于我的应用程序 我的问题是 当我将我的应用程序作为脚本运行时 即未内置到 exe文件
  • 当 C 预处理器宏定义两次时会发生什么?

    我定义了一个宏两次 如下所示 define a 2 define a 3 我认为任何发生a代码中将替换为2 什么时候 define a 3遇到了就没有了a代码中的 s 可以替换为3 所以2将优先 但是当我执行它的时候a被替换为3 为什么 如
  • 当我使用 XmlSerializer 反序列化时,为什么我的 DbNull 不是单例?

    我一直认为 DbNull value 是一个单例 因此你可以这样做 VB NET If someObject Is DbNull Value Then End if C If someObject DbNull Value 但最近 我使用
  • Azure 数据工厂和 SharePoint

    我有一些 Excel 文件存储在 SharePoint Online 中 我想要将 SharePoint 文件夹中存储的文件复制到 Azure Blob 存储 为了实现这一目标 我使用 Azure 门户在 Azure 数据工厂中创建一个新管
  • 写入RenderTarget后,如何高效克隆输出?

    XNA菜鸟在这里 每天都在学习 我刚刚弄清楚如何使用 RenderTarget2D 将多个纹理合成为一个 然而 虽然我可以将 RenderTarget2D 用作 Texture2D 来满足大多数用途 但有一个关键的区别 当调整后缓冲区大小时