Java 交错可重入锁定(用于3D相机移动,LWJGL)

Java 交错可重入锁定(用于3D相机移动,LWJGL),java,lwjgl,reentrantlock,Java,Lwjgl,Reentrantlock,我的问题是,对于一个特定的情况,交错多个可重入锁定是否是一个有效的选择:3D空间中的摄影机移动(LWJGL,openGL)——当然是图形表示 我的camera controller对象拥有一个私有方法来操纵modelview矩阵(lookThrough()),因此我可以在3D空间中“行走”和“旋转”用户视图。它包含公共方法(即,walkForward()),允许其他类/对象更改与运动相关的变量(俯仰,偏航,位置)。现在,用户控件的对象/线程不断更改位置,以及偏航和俯仰。同时,主窗口(图形)使用l

我的问题是,对于一个特定的情况,交错多个可重入锁定是否是一个有效的选择:3D空间中的摄影机移动(LWJGL,openGL)——当然是图形表示

我的camera controller对象拥有一个私有方法来操纵modelview矩阵(
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()
-方法时忽略锁。用户通过“摄像头”的视图不会是线程安全的,但是,实际的摄像头位置是。因此,用户的视图不能被它完全破坏

足够多的混乱-为了简单起见,这里总结了我的主要问题:

  • 你会交错锁还是重入锁?在这种特殊情况下
  • 当“同时”使用多个锁时(我知道这不完全是同一时间),您实际如何设计代码
  • 是否建议将单锁对象汇总为一个锁以锁定所有对象
  • 如果我跟踪每个渲染循环中应用于该矩阵的实际“摄影机”位置和旋转,那么在openGL/LWJGL中操纵modelmatrix时是否可以忽略使用锁

  • 谢谢你的建议

    是否没有人愿意提供答案或提示?