IDirect3DVertexBuffer9 :: Lock失败的可能原因是什么?

时间:2010-05-05 07:35:18

标签: directx direct3d direct3d9

在一些错误报告中,我经常看到以下行为:IDirect3DVertexBuffer9 :: Lock失败,返回的错误代码为D3DERR_NOTAVAILABLE。

一旦发生这种情况,非常频繁(但并非总是如此),然后是CreateTexture或CreateVertexBuffer失败并出现错误D3DERR_OUTOFVIDEOMEMORY。

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

3 个答案:

答案 0 :(得分:1)

基于来自微软的Chuck Walbourn的DIRECTXDEV回应,除了“地址空间不足”之外,另一个原因可能是“页外游泳池”。

  

或者,在Windows XP上,这可能表明您已达到页面缓冲池内核内存的限制。通常,当您创建大量Direct3D资源(纹理等)

时会发生这种情况

我们创造了很多Direct3D资源。

答案 1 :(得分:0)

这是我发布到DirectXDev:;)

  

你有没有检查过多少内存?   申请正在使用? (务必   选择虚拟内存列   任务管理器!)。我的猜测是   基于内存碎片的问题   正如你的建议,让你跑步   超出地址空间。

     然而,它可能是一个驱动程序错误...

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

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

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

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

答案 2 :(得分:0)

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