【问题标题】:What are possible causes of IDirect3DVertexBuffer9::Lock failing?IDirect3DVertexBuffer9::Lock 失败的可能原因是什么?
【发布时间】:2010-05-05 07:35:18
【问题描述】:

在我们游戏的一些最终用户的错误报告中,我经常看到以下行为:IDirect3DVertexBuffer9::Lock 失败,返回的错误代码是 D3DERR_NOTAVAILABLE

一旦发生这种情况,通常(但不总是)随后会出现 CreateTextureCreateVertexBuffer 调用失败并出现错误 D3DERR_OUTOFVIDEOMEMORY

顶点缓冲区锁定失败的可能原因是什么?虚拟内存地址空间是否会耗尽,还是什么?

【问题讨论】:

  • 发布 Lock() 调用的详细信息。但也许问题已经解决了? :)

标签: directx direct3d direct3d9


【解决方案1】:

根据来自 Microsoft 的 Chuck Walbourn 的 DIRECTXDEV 响应,除了“地址空间不足”之外,另一个原因可能是“页面池不足”。

或者,在 Windows XP 上,这可能表明您已达到分页池内核内存的限制。当您创建大量 Direct3D 资源(纹理等)时,通常会发生这种情况

我们确实创建了很多 Direct3D 资源。

【讨论】:

    【解决方案2】:

    这是我发布到 DirectXDev 的内容:;)

    你有没有检查过你的内存有多少? 应用程序正在使用? (务必 选择虚拟内存列 任务管理器!)。我的猜测是 基于内存碎片的问题 导致您按照您的建议运行 地址空间不足。

    但是,它可能是驱动程序错误 ...

    调试运行时是否提供任何有用的信息?

    编辑:我能想到的唯一另一件事是光圈内存已用完。我不知道这如何与 PCIExpress 一起工作,但在 AGP 上你可以设置光圈大小。但是,我不知道如何检查它是否已满。我怀疑您看到的错误是报告它已满。您是否正在使用 Discard 标志进行大量锁定?如果是这样,它们可能会在光圈中创建大量新分配,并导致您那里的内存不足。然而,这纯粹是猜测工作。

    猜想如果这种情况只发生在您的部分用户身上,那就是低端机器上的用户。如果事情运行缓慢,那么您最终可能会在命令缓冲区中缓冲大量数据。这将使控制滞后,并且“可能”会导致您看到的问题。您可能想尝试确保命令缓冲区永远不会太长。如果您确保在没有丢弃标志(即标志设置为 0)的情况下完成每一帧的第一次锁定,那么这将导致管道停止,直到顶点缓冲区被渲染并使命令缓冲区与您恢复同步。这将导致速度变慢,因为命令缓冲将无法轻松消除帧速率尖峰...

    无论如何...这只是一个猜测!

    【讨论】:

    • 是的,我做到了。似乎有很多虚拟内存。我什至还测试了一个想法,我遍历并查询了整个 VM 范围,以检查空闲 VM 空间是否严重碎片化。最大可用空间为 255 MB,因此在这种情况下,VM 地址应该不是问题。
    • 驱动bug,nVidia和AMD显卡我都经历过。
    • > 调试运行时是否提供任何有用的信息?我不知道。我从来没有在我的系统上见过它,我只从用户那里得到它。
    • 啊……这是个问题。您是否确认他们有最新的驱动程序?如果没有一台显示错误并提供信息的机器,这可能会非常困难。
    【解决方案3】:

    关于内存不足的问题是有效的。我们需要一些关于 Lock() 调用的详细信息来确定,但是 例如,如果它在 DEFAULT 池中并且它是动态的(通过了 D3DLOCK_DISCARD 标志),那么您的驱动程序很可能会尝试找到一块未使用的内存来返回(因为它在内部有两倍或三倍的缓冲区)并且失败了,因为你很快就会发现自己的视频内存已经耗尽。

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多