代码之家  ›  专栏  ›  技术社区  ›  Suma

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

  •  1
  • Suma  · 技术社区  · 16 年前

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

    一旦发生这种情况,就会经常(但并不总是)出现createTexture或createVertexBuffer失败,并出现视频内存不足的错误d3derr。

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Suma    16 年前

    根据微软的查克沃尔伯恩的directxdev响应,除了“地址空间不足”之外,另一个原因可能是“页面池不足”。

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

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

        2
  •  0
  •   Goz    16 年前

    这是我发布给directxdev的:;)

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

    不过,这可能是一个驱动程序错误…

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

    编辑:我唯一能想到的是光圈内存用完了。我不知道这是如何与pciexpress工作的,但在agp上你可以设置光圈大小。我不知道怎么检查它是否满了。我怀疑你看到的错误是报告它已满。你用废弃标志锁了很多锁吗?如果是这样的话,它们可能会在光圈中创建大量的新分配,并导致内存不足。不过,这是纯粹的猜测工作。

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

    总之…只是猜测而已!

        3
  •  0
  •   nielsj    16 年前

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

    推荐文章