【问题标题】:OpenGL GLFW application - client side memory limitOpenGL GLFW 应用程序 - 客户端内存限制
【发布时间】:2020-03-30 08:53:13
【问题描述】:

我在 Windows 10 x64 上工作。 32 位进程最多可使用 2GB 内存。我已经测试过了:一个只分配 25mb 内存块的简单程序可以使用约 1950mb 的内存。超过该大小后,malloc 返回 null。我使用 GLFW 库创建了一个简单的 OpenGL 应用程序。它只显示一个空窗口 - 任务管理器显示内存使用量约为 26 mb。我注意到,当我在调用以下函数后尝试执行 malloc 测试时:

glfwSetErrorCallback(error_callback);

if (!glfwInit())
{
    exit(EXIT_FAILURE);
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);

GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, "LegacyGL", NULL, NULL);

if (!window)
{
    glfwTerminate();
    exit(EXIT_FAILURE);
}

glfwSetKeyCallback(window, key_callback);
glfwMakeContextCurrent(window);
glfwSwapInterval(1);

当应用程序内存使用量约为 1600mb 时,malloc 返回 null。我还没有分析 GLFW 源代码,但它怎么可能?在执行 malloc 测试之前,内存使用量约为 24mb。任务管理器是否可能没有显示程序已使用的所有内存。

编辑:

减少 malloc 大小后,程序能够分配大约 1800mb。看起来 opengl 驱动程序映射了程序的一些内存区域,但任务管理器没有显示它。你知道有什么工具可以检查驱动程序映射了多少内存吗?哪些 OpenGL 函数会增加这种映射的内存区域?

【问题讨论】:

  • 这是可能的,因为地址空间碎片(没有连续的 24mb 块)。当malloc 返回 null 时,继续重试分配,块大小不断减小,直到您获得成功的分配 - 重复。有一个合理的下限,比如 4K(或平台页面大小)。
  • 所以看起来 GLFW lib 会导致如此严重的内存碎片。
  • 不确定;所以只是评论。上面的测试编写起来并不难,所以你可以自己证明(或反驳)它。
  • 另一个罪魁祸首可能是视频驱动程序的 OpenGL 实现。通常它需要映射一些内存区域来与硬件通信。
  • @Botje 请参阅编辑

标签: c++ c opengl memory-management glfw


【解决方案1】:

32 位程序的 2GB 限制是 地址空间。这是您可以拥有的内存地址数量的限制

任务管理器显示实际使用的内存

在不实际使用内存的情况下使用完地址是可能的,而且相当普遍。例如,驱动程序可能会为一大块显卡内存分配地址,即使它还没有使用任何内存。


或者,可能是分配了内存,但它不是任务管理器显示的类型。我不确定“进程”选项卡中显示的是哪种类型的内存,但如果您转到“详细信息”选项卡,您应该会看到该列实际上称为“内存(活动私有工作集)”。如果您将鼠标移到上面,工具提示会显示“进程使用的、其他进程无法使用的物理内存量。

这比你最初想象的更具体:

  • 如果内存与任何其他进程共享,则不计算在内。
  • 如果内存当前在磁盘上(不在物理 RAM 中),则不计算在内。
  • 如果内存已分配但尚未访问,则不计算在内。在这种情况下,它不在物理 RAM 中,但也不在磁盘上,因为操作系统知道存储空白内存没有意义。

总而言之,造成这种差异的原因有很多。如果您需要使用大量内存,请将您的程序编译为 64 位。

【讨论】:

  • 哪些OpenGL函数可以增加这样的映射内存区域?
  • @Irbis 所有人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2014-03-26
  • 2017-07-27
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多