【问题标题】:Direct3D texture resource life cycleDirect3D 纹理资源生命周期
【发布时间】:2014-06-29 08:59:37
【问题描述】:

我一直致力于在 Windows Phone 上使用 Direct3D 的项目。这只是一个带有 2d 图形的简单游戏,我使用 DirectXTK 来帮助我制作精灵。

最近,我在 512mb 模拟器上调试时遇到内存不足错误。这个错误并不常见,是一系列 open、suspend、open、suspend ... 的结果。

跟踪它,我发现每次激活应用程序时都会加载纹理,并最终填满允许的内存。为了解决这个问题,我可能会去编辑它,以便仅在打开时加载纹理,但从暂停中激活;但是在这个问题之后,我很好奇纹理资源的正确生命周期管理。在搜索时,我遇到了自动(或由微软“管理”)纹理管理http://msdn.microsoft.com/en-us/library/windows/desktop/bb172341(v=vs.85).aspx。这可能有助于对视频内存中的纹理进行一些管理。

但是,我也想知道其他方法,因为我想不出一种将托管纹理合并到我的代码中的好方法。

我最好是调用我存储在析构函数中的 ID3D11ShaderResourceView 指针的 Release 方法来防止内存填满,但是我如何确保纹理在内存中休息而其他应用程序想要使用它(内存)?

【问题讨论】:

    标签: windows-phone-8 direct3d


    【解决方案1】:

    Windows 手机使用 Direct3D 11,它“虚拟化”了 GPU 内存。基本上每个纹理都是“管理的”。如果您想对此进行详细说明,请参阅“Why Your Windows Game Won't Run In 2,147,352,576 Bytes?"。您提供的链接是适用于 Windows XP XPDM 的 Direct3D 9 时代,而不是任何支持 Direct3D 11 的平台。

    听起来关键问题是您的应用程序正在泄漏资源或工作集太大。您应该启用debug device 并首先确保您已按预期清理了所有内容。您可能还想检查您是否遵循在MSDN 上启动/恢复的建议。另请记住,Direct3D 11 使用“延迟销毁”资源,所以仅仅因为您在任何地方都调用了 Release 并不意味着所有资源实际上都消失了......要强制完全销毁,您需要使用 Flush .

    在 Windows phone 8.1 和 Direct3D 11.2 中,您可以使用特定的 Trim 功能来减少应用程序的内存占用,但我认为这实际上不是您的问题。

    【讨论】:

    • 对不起,迟到的评论。当我试图找出问题并搜索自动纹理管理时,该链接是我最终的结果并假设相同的原则将适用,我的错。其实,对于我在必要时开始使用Release后的问题,我的问题已经解决了。
    • 但问题是,每次激活应用程序(新启动或背景)时,我都必须加载和释放纹理,这对于我不起眼的游戏来说是可以的。但考虑到纹理,我认为更重的游戏不会这样做加载可能需要一些时间。我玩的一些重度游戏可能会立即出现。抱歉,如果我无法在帖子中说清楚,但我想知道如何更巧妙地管理纹理。我的意思是,当应用程序打开时加载纹理,当应用程序进入后台并再次进入前台时,我可能不必重新加载纹理(可能仍在内存中)。虚拟化是我的答案吗?
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多