LWJGL新手 - 什么是stackPush(),mallocInt(1)和类似的GLFW方法?
问题描述:
我第一次学习LWJGL,并在LWJGL3 site上探索一个简单的代码块作为示例。我从来没有使用过OpenGL或GLFW。LWJGL新手 - 什么是stackPush(),mallocInt(1)和类似的GLFW方法?
我不明白这一小块代码。如果我删除它,主代码仍然有效。这整个事情只是为了创造中心窗口吗?
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
类的速度快得多。为了获得堆栈,请致电stackPush()
。通过像这样将它放在try
子句中,它使得堆栈分配成为线程本地,并且弹出堆栈并在完成try
语句后释放缓冲区。
MemoryStack.mallocXX(count)
(其中xx是类型,count是缓冲区大小)是从堆栈分配的方式。 stack.mallocInt(1)
从堆栈中返回一个大小为1的整数缓冲区,而不是堆。
一般来说,当您在制服或任何需要缓冲区的地方使用时,请使用MemoryStack.stackPush()
。 LWJGL有一篇关于LWJGL3中不同内存管理方法的很好的文章(here),我绝对建议花时间坐下来学习这些新的内存技术。