OpenGL GLFW应用程序-客户端内存限制

问题描述 投票:0回答:1

我在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);

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

编辑:

减小malloc大小后,程序可以分配大约1800mb。看起来opengl驱动程序映射了程序的某些内存区域,但任务管理器未显示它。您是否知道任何工具可以检查驱动程序已映射多少内存?哪些OpenGL函数会增加此类映射的内存区域?

c++ c opengl memory-management glfw
1个回答
0
投票

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

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

[而且有可能而且相当普遍地-用尽地址而没有实际用尽内存。例如,驱动程序可能会为大量的图形卡内存分配地址,即使它尚未使用任何内存。


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

这比起初您想的要具体:

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

  • 总而言之,这种差异可能会发生的原因很多。如果需要使用大量内存,请将程序编译为64位。

© www.soinside.com 2019 - 2024. All rights reserved.