LWJGL新手 – 什么是stackPush()、mallocInt(1)和类似的GLFW方法?

LWJGL Newbie – What are stackPush (), mallocInt (1) and similar GLFW methods?

我是第一次学习 LWJGL 并在 LWJGL3 site 上探索作为示例给出的简单代码块。我以前从未使用过 OpenGL 或 GLFW。

我不明白这一小段代码。如果我删除它,主要代码仍然有效。难道这一切只是为了让 window 以创作为中心吗?

mallocInt (1) 是什么意思? stackPush() 和奇怪的方法调用的整个想法已经混淆了。我用过 SWT 和 awt,但从未见过类似的东西。

// Get the thread stack and push a new frame

try ( MemoryStack stack = stackPush() ) {

    IntBuffer pWidth = stack.mallocInt(1); // int*
    IntBuffer pHeight = stack.mallocInt(1); // int*

    // Get the window size passed to glfwCreateWindow
    glfwGetWindowSize(window, pWidth, pHeight);

    // Get the resolution of the primary monitor
    GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

    // Center the window
    glfwSetWindowPos(window,
        (vidmode.width() - pWidth.get(0)) / 2,
        (vidmode.height() - pHeight.get(0)) / 2);

}

// the stack frame is popped automatically

非常感谢任何帮助。

LWJGL 允许以比纯 Java 通过 MemoryStack class 更快的速度在堆栈上分配内存。为了获得堆栈,您调用 stackPush()。通过将它放在 try 子句中,就像你所做的那样,它使得堆栈分配是线程本地的,一旦 try 语句完成,堆栈就会弹出并释放缓冲区。

MemoryStack.mallocXX(count)(其中 xx 是类型,count 是缓冲区的大小)是如何从堆栈分配的。 stack.mallocInt(1) returns 来自堆栈而不是来自堆的大小为 1 的整数缓冲区。

一般来说,当你在做制服或任何需要缓冲的地方时,使用MemoryStack.stackPush()。 LWJGL 有一篇非常好的文章 (here) 介绍了 LWJGL3 中不同的内存管理方法,我强烈建议您花时间坐下来学习这些新的内存技术。