在某些错误报告中,我经常看到以下行为:idirect3dvertexbuffer9 ::锁定失败,返回的错误代码为d3derr_notavailable。

一旦发生这种情况,(但并非总是如此),随后会出现createTexture或createvertexbuffer失败,而错误d3derr_outofvideomememory。

顶点缓冲区锁定故障的可能原因是什么?虚拟内存地址空间可以用尽,还是什么?

有帮助吗?

解决方案

根据Microsoft的Chuck Walbourn的DirectXdev响应,除了“淘汰地址空间”之外,另一个原因可能是“外面池”。

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

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

其他提示

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

您是否检查过您的应用程序正在使用多少内存? (请确保在任务管理器中选择“虚拟内存”列!)。我的猜测是基于内存碎片的问题,正如您所建议的那样,您的地址空间用完了。

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

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

编辑:我唯一能想到的另一件事是光圈内存已经用完了。我不知道这是如何与pciexpress一起使用的,但是在AGP上,您可以设置光圈大小。我不知道如何检查它是否已满。我怀疑您看到的错误是报告说已满。您在丢弃标志上做很多锁吗?如果可以的话,这些可能会在孔径中产生大量的新分配,并导致您在那里耗尽内存。但是,这是纯粹的猜测工作。

ID 猜测 如果您的某些用户只会发生这种情况,那就是下端机器上的那些用户。如果情况缓慢运行,则可以在命令缓冲区中得到许多缓冲的数据。这将使控制迟钝,并且可以猜测“可以”导致您看到的问题。您可能需要尝试确保命令缓冲区永远不会太长。如果确保在没有丢弃标志的情况下完成每个帧的第一个锁定(即设置为0),则将导致管道停止,直到渲染顶点缓冲区并将命令缓冲区带回与您同步为止。这将导致放缓,因为命令缓冲将无法轻易平滑帧速率。

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

关于不记忆的提出问题是有效的。我们需要有关lock()调用的一些详细信息,以确保, 例如,如果它在默认池中,并且如果它是动态的(D3DLock_discard标志),则您的驾驶员很有可能试图找到一块未使用的内存以返回(因为它在内部两倍或三重缓冲区)并且失败了,因为AS AS AS AS AS AS您很快就会发现自己,视频记忆已经耗尽。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top