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

Directx IDirect3DVertexBuffer9::锁失败的可能原因是什么?,directx,direct3d,direct3d9,Directx,Direct3d,Direct3d9,在我们游戏的一些最终用户的错误报告中,我经常看到以下行为:IDirect3DVertexBuffer9::Lock失败,返回的错误代码是D3DERR\u NOTAVAILABLE 一旦发生这种情况,很频繁(但不总是)会出现CreateTexture或CreateVertexBuffer调用失败,错误为D3DERR\u OUTOFVIDEOMEMORY 顶点缓冲区锁定失败的可能原因是什么?虚拟内存地址空间是否会耗尽,或者是什么?这是我在DirectXDev上发布的内容:;) 你检查过你的内存有多少

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

一旦发生这种情况,很频繁(但不总是)会出现
CreateTexture
CreateVertexBuffer
调用失败,错误为
D3DERR\u OUTOFVIDEOMEMORY


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

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

你检查过你的内存有多少吗 应用程序正在使用?(一定要 在中选择虚拟内存列 任务管理器!)。我猜是 基于内存碎片的问题 让你像你建议的那样逃跑 地址空间不足

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

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

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

我猜如果这只发生在你的一些用户身上,那就是那些低端机器上的用户。如果运行缓慢,那么最终可能会在命令缓冲区中缓冲大量数据。这将使控制滞后,“可能”,在一个猜测,导致您看到的问题。您可能需要尝试确保命令缓冲区不会太长。如果确保在没有放弃标志(即标志设置为0)的情况下完成每个帧的第一次锁定,则这将导致管道暂停,直到渲染顶点缓冲区并使命令缓冲区与您重新同步。这将导致速度减慢,因为命令缓冲无法轻松消除帧速率峰值


无论如何。。。那只是猜测

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

你检查过你的内存有多少吗 应用程序正在使用?(一定要 在中选择虚拟内存列 任务管理器!)。我猜是 基于内存碎片的问题 让你像你建议的那样逃跑 地址空间不足

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

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

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

我猜如果这只发生在你的一些用户身上,那就是那些低端机器上的用户。如果运行缓慢,那么最终可能会在命令缓冲区中缓冲大量数据。这将使控制滞后,“可能”,在一个猜测,导致您看到的问题。您可能需要尝试确保命令缓冲区不会太长。如果确保在没有放弃标志(即标志设置为0)的情况下完成每个帧的第一次锁定,则这将导致管道暂停,直到渲染顶点缓冲区并使命令缓冲区与您重新同步。这将导致速度减慢,因为命令缓冲无法轻松消除帧速率峰值


无论如何。。。那只是猜测

提出的关于内存不足的问题是有效的。我们需要一些关于Lock()调用的详细信息才能确定,但例如,如果它在默认池中,并且是动态的(D3DLOCK_DISCARD flag已通过),则很可能是驱动程序试图找到一块未使用的内存来返回(因为它在内部具有两倍或三倍的缓冲区),然后失败,因为不久之后您发现,视频内存已耗尽。

提出的内存不足问题是有效的。我们需要一些关于Lock()调用的详细信息才能确定,但例如,如果它在默认池中,并且是动态的(D3DLOCK_DISCARD flag已通过),则很可能是驱动程序试图找到一块未使用的内存来返回(因为它在内部具有两倍或三倍的缓冲区),然后失败,因为不久之后您发现,视频内存耗尽。

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

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


我们确实创建了大量Direct3D资源。

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

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


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

是的,我创建了。似乎有大量的虚拟内存。我甚至还测试了另一个想法,我已经遍历并查询了整个虚拟机范围,以检查空闲虚拟机空间是否严重碎片化。最大的可用空间是255MB,因此在这种情况下VM地址应该不是问题。至于驱动程序错误,我有经验