java - 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() 之间的区别吗?
解决方案
LWJGL 3MemoryStack
将每个线程的固定数量的堆外(本机)内存作为ThreadLocal
变量。静态方法MemoryStack.stackPush()
将查找viaThreadLocal
的每个线程实例,然后调用实例方法。因此,您将获得调用线程的已查找线程本地实例。MemoryStack
MemoryStack.stackGet()
MemoryStack.push()
stackPush()
MemoryStack
因此,为了获得最佳性能,您应该将此MemoryStack
实例“拖”到其他方法中并避免调用MemoryStack.stackGet()
.
但是,JVM(在其内联边界内)可能会在MemoryStack.stackGet()
开始时将多次调用(或者更确切地说是其中的线程本地查找)优化为单个查找,因为没有其他线程可以更改调用线程的线程-本地价值。
推荐阅读
- google-cloud-storage - 查询旧的 Google Cloud Datastore 记录时,foo__icon 的 QuerySet 为空
- bash - 循环中的 Bash 脚本表达式语法崩溃
- excel - 将活动单元格复制到清除的文本框并保留超链接
- javascript - Angular Firestore: Check if data exist and update a global variable based on that
- c++ - 部分模板特化:为什么部分特化列表中的某些变量与主模板不同
- javascript - Javascript按键使灯亮
- c# - Selenium.WebDriver.ChromeDriver - chromedriver.exe 未针对 netcore2.2 目标框架发布
- angular - FileWriter/FileReader 错误,没有响应。角度/离子
- c# - 部署的 C# 应用程序需要 Windows 8.1 和通用 CRT SDK
- python - tkinter multiprocessing-root 窗口倒计时时没有响应