我正在使用LWJGL库,不幸的是,每当我的场景图中的节点需要死时,我都需要释放纹理/ vbo缓冲区,我甚至无法使用finalize()方法来执行此操作,因为我无法保证它将在opengl libs期望的同一个线程中执行.
所以我正在使用PhantomReferences.在我的场景图节点中,我将它放在构造函数中:
phantomReference = new ScenePhantomReference(this, Game.phantomReferenceQueue);
Game.phantomReferenceList.add(phantomReference);
Run Code Online (Sandbox Code Playgroud)
正如您在第二行中看到的,我已将phantomReference添加到主类中的列表中.我的逻辑是,当节点被解除引用时,phantomReference将不会被垃圾收集,因为在主类中仍然存在引用.
将它添加到需要的列表中吗?或者它是否会从GC中幸免(可能Game.phantomReferenceQueue会保留对它的引用?).
这个很难测试,我可以删除列表,但GC可能只是在phantomReference之前处理正在观察的对象,并使它看起来像列表是多余的,当它真的没有.我很偏执,任何不同的VM实现或版本都可能决定反过来这样做.
以下代码给出了错误:
SceneNode.java:17: cannot find symbol
symbol : method execute() location:
class java.lang.Object
operation.execute();
^ 1 error
Run Code Online (Sandbox Code Playgroud)
码:
import java.util.LinkedList;
import java.util.Iterator;
public class SceneNode<T>{
T operation;
public SceneNode() {
}
public SceneNode(T operation) {
this.operation = operation;
}
public void setOperation(T operation) {
this.operation = operation;
}
public void doOperation() {
operation.execute();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的场景图的缩减(为了您的可读性).节点可以是模型,转换,开关等,所以我创建了一个变量,称为operation类型由T类变量定义.这样我就可以传递一个Transformation/ Model/ Switch对象(有一个execute方法)并像这样传递它:
SceneNode<Transformation> = new SceneNode<Transformation>(myTransformation);
Run Code Online (Sandbox Code Playgroud)
我很确定SceneNode为所有各种类型的节点都有一个基类和子类是一个更好的主意(我正在尝试泛型,最近才了解它们).为什么这不起作用?我必须遗漏一些关于泛型的基本知识.