gpt4 book ai didi

c++ - 超出 DirectX11 视频内存

转载 作者:行者123 更新时间:2023-11-30 03:34:20 26 4
gpt4 key购买 nike

我有一个渲染循环,用于监听数位板输入并从顶点/索引缓冲区(以及其他内容)中绘制。顶点数据可以增长,当它达到一定水平时,DispatchMsg(&msg) 会遇到这种情况:

Unhandled exception at 0x5DDBDEF0 (msvcr110d.dll) in App.exe: 0xC0000005: Access violation writing location 0x00000000.

场景中分配的顶点和索引缓冲区的总大小每次都在同一水平附近:

Total Vertices count: 10391370
Total Indices count: 41565480
Total Vertices size: 249392880 (bytes)
Total Indices size: 997571520 (bytes)

在另一个样本中:

Total Vertices count: 9969300
Total Indices count: 39877200
Total Vert size: 239263200
Total Indices size: 957052800

顶点和索引缓冲区都是 D3D11_USAGE_DEFAULT。场景中的总大小分配高于上面列出的,但较小的缓冲区经常被释放。末尾的顶点/索引缓冲区中也有一些填充。

每次(到达异常时)要派发的消息是581,我认为可能是:

#define WM_POINTERUPDATE                0x0245

我真的不介意场景渲染缓慢,但如果我达到某个最大内存分配(视频内存?)是否有一种方法可以让内存以速度为代价缓慢地分页到/从 maim 内存?我尝试禁用调用像素、顶点着色器和绘图调用的 draw() 调用,但异常仍然发生。与异常相比,我更喜欢速度权衡或解决方法。

最佳答案

从您问题中的数字来看,您似乎为顶点和索引数据分配了大量内存(大约 1.2GB)。如果您的应用是 32 位(x86,而不是 x64),它只能访问 2GB 内存,因此很可能是您的进程内存不足。

GPU 可以访问部分系统内存(与 GPU 内存相比,这相当慢,但总比没有内存好)。例如,对于 NVidia GPU,NVidia 控制面板在“系统信息”>“共享系统内存”下显示它;这通常是系统中 RAM 总量的一半。据我所知,这个系统内存占用了你进程地址空间的一部分。

如果您的“相当老”的 GPU 有 512MB 的内存,它需要大约 768MB 的额外系统内存才能满足您的内存请求。这为您的应用程序留下了 1.2GB。我猜你的应用程序试图在数组中分配 1.2GB 的系统内存,这些内存将获取你想要上传到 GPU 的几何数据。这正好合适,但您的应用程序代码也需要位于某个地方。在这个假设的情况下,您的内存已经用完了。当然,您可以在将几何数据上传到 GPU 后摆脱系统内存阵列,但就在此时,系统没有足够的内存来创建您请求大小的 GPU 内存缓冲区.

将项目切换为 64 位(在 Visual Studio 中为 x64)将使您的进程占用更多的内存(在大多数情况下达到系统和页面文件中可用的内存),并解决您的问题。如果内存限制确实是问题所在。

另一件事:我注意到 - 假设你的数字是正确的 - 你为索引缓冲区的每个索引分配了 24 个字节,就像你为顶点缓冲区中的每个顶点分配的一样多。那是对的吗?索引(只是顶点缓冲区的偏移量)不应大于 4 个字节。您是否真的尝试分配实际需要的 6 倍 GPU 内存,还是您的应用程序计算错误?

如果您快速释放然后在 GPU 上重新创建一个缓冲区,那么 D3D 可能会将“旧”缓冲区保留一段时间(至少只要它仍然绑定(bind)到 GPU 管道),所以它可能是因此内存不足。因此,它可能有助于实际解除绑定(bind)您即将释放的缓冲区(通过调用 IASetVertexBuffers(NULL, 0, 0, 0, 0)IASetIndexBuffer(NULL, DXGI_FORMAT_R16_UINT, 0) )。

关于c++ - 超出 DirectX11 视频内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com