首页 > 解决方案 > LWJGL 3 : StackGet() 用法

问题描述

我一直想知道我是否正确使用了 stackPush() 和 stackGet() 。目前,如果我必须使用堆栈,我将首先制作如下内容:

try (var stack = MemoryStack.stackPush()) {
...
}

然后,如果我在 try 块中调用一个方法,我将使用 stackGet() 来避免在方法的参数中传递堆栈:

try (var stack = MemoryStack.stackPush()) {
foo();
}
...
void foo() {
var stack = stackGet();
...
}

我在 javadoc 上没有找到关于 stackGet() 的任何真正解释,所以我是否正确使用了这个函数?如果我错了,有人可以解释一下 stackPush() 和 stackGet() 之间的区别吗?

标签: javalwjgl

解决方案


LWJGL 3MemoryStack将每个线程的固定数量的堆外(本机)内存作为ThreadLocal变量。静态方法MemoryStack.stackPush()将查找viaThreadLocal的每个线程实例,然后调用实例方法。因此,您将获得调用线程的已查找线程本地实例。MemoryStackMemoryStack.stackGet()MemoryStack.push()stackPush()MemoryStack

因此,为了获得最佳性能,您应该将此MemoryStack实例“拖”到其他方法中并避免调用MemoryStack.stackGet().

但是,JVM(在其内联边界内)可能会在MemoryStack.stackGet()开始时将多次调用(或者更确切地说是其中的线程本地查找)优化为单个查找,因为没有其他线程可以更改调用线程的线程-本地价值。


推荐阅读