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

我在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函数会增加此类映射的内存区域?

lluozzi 回答:OpenGL GLFW应用程序-客户端内存限制

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

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

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


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

这比起初您想的要具体:

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

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

本文链接:https://www.f2er.com/2970405.html

大家都在问