Java 交错可重入锁定(用于3D相机移动,LWJGL)
我的问题是,对于一个特定的情况,交错多个可重入锁定是否是一个有效的选择:3D空间中的摄影机移动(LWJGL,openGL)——当然是图形表示 我的camera controller对象拥有一个私有方法来操纵modelview矩阵(Java 交错可重入锁定(用于3D相机移动,LWJGL),java,lwjgl,reentrantlock,Java,Lwjgl,Reentrantlock,我的问题是,对于一个特定的情况,交错多个可重入锁定是否是一个有效的选择:3D空间中的摄影机移动(LWJGL,openGL)——当然是图形表示 我的camera controller对象拥有一个私有方法来操纵modelview矩阵(lookThrough()),因此我可以在3D空间中“行走”和“旋转”用户视图。它包含公共方法(即,walkForward()),允许其他类/对象更改与运动相关的变量(俯仰,偏航,位置)。现在,用户控件的对象/线程不断更改位置,以及偏航和俯仰。同时,主窗口(图形)使用l
lookThrough()
),因此我可以在3D空间中“行走”和“旋转”用户视图。它包含公共方法(即,walkForward()
),允许其他类/对象更改与运动相关的变量(俯仰
,偏航
,位置
)。现在,用户控件的对象/线程不断更改位置
,以及偏航
和俯仰
。同时,主窗口(图形)使用lookThrough()
-方法将位置和旋转因子应用于modelview矩阵。所有相机移动方法和modelview矩阵操作都使用前面提到的一个或所有空间变量
在限制并发线程的访问之前,这里有两种提到的方法来访问camera controller对象。它们清楚地显示了访问相同变量的问题,而摄影机的移动和modelview矩阵的操作可能同时发生:
// moves camera forward rel. to its current rotation (yaw)
public void walkForward(float distance){
position.x -= distance * (float)Math.sin(Math.toRadians(yaw));
position.z += distance * (float)Math.cos(Math.toRadians(yaw));
position.y += distance * (float)Math.sin(Math.toRadians(pitch));
}
// translate and rotate to look through the camera
public void lookThrough(){
// rotate the pitch around the X-axis
GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
// rotate the yaw around the Y-axis
GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
// translate to the location defined int he position vector
GL11.glTranslatef(position.x, position.y, position.z);
}
为了限制线程对给定线程的这些变量的访问,我假设Java的标准Lock
-或ReentrantLock
-类将完成这项工作。我可以为每个空间变量创建锁,也可以为所有空间变量创建一个锁。假设我要使用多重重入锁定方法,我在如何正确锁定和解锁所有锁定对象方面遇到了问题。我是否应该像下面的示例中那样执行此操作:
lock_pitch.lock();
lock_yaw.lock();
lock_position.lock();
try{
[...]
}
finally{
lock_pitch.unlock();
lock_yaw.unlock();
lock_position.unlock();
}
还是建议在多个try-finally块中交错锁:
lock_pitch.lock();
try{
lock_yaw.lock();
try{
lock_position.lock();
try{
// put executed code here
}
finally{
lock_position.unlock();
}
}
finally{
lock_yaw.unlock();
}
}
finally{
lock_pitch.unlock();
}
第二个例子在我看来很尴尬。因此,我会选择第一种方法,以较少交错的方式锁定和解锁。也许最好只使用一个锁来管理线程访问。这样,锁定和解锁将非常简单。在超过一半的情况下,所有空间变量都将同时访问。也许我可以在使用lookThrough()
-方法时忽略锁。用户通过“摄像头”的视图不会是线程安全的,但是,实际的摄像头位置是。因此,用户的视图不能被它完全破坏
足够多的混乱-为了简单起见,这里总结了我的主要问题:
谢谢你的建议 是否没有人愿意提供答案或提示?