假设我的游戏应用程序中有两个线程(除了主线程):
- GLRenderer 线程(由 Android 提供
GLSurfaceView.Renderer
) - 另一个线程(游戏线程)
两个线程都使用 JNI 调用应用程序的某些 C++(即 Android NDK)组件。
假设我IntBuffer
在 Java 中直接分配(例如从 GLRenderer 线程,但不要假设这个)。事实:
- 此直接缓冲区由 GLRenderer 线程中的本机代码读取(即由通过 JNI 调用的 C++ 组件)
- 这个直接缓冲区有时是从另一个线程(游戏线程)写入的
在以下两种情况下,同步(实际上是确保数据可见性)的(最佳)方式是什么,即保证 GLRenderer 代码中的本机代码看到最新的IntBuffer
内容?
- 场景 #1:游戏线程的 Java 代码写入
IntBuffer
(例如 viaIntBuffer.put()
) - 场景#2:从游戏线程调用的本机代码写入
IntBuffer
我在想标准的 Java 同步将适用于这两种情况:
public void onDrawFrame(GL10 gl) { // the GLRenderer thread
// ...
synchronized (obj) {
callNativeCode1(); // a JNI call; this is where the C++ native code reads the IntBuffer
}
}
public void run() { // the game thread
// ...
synchronized (obj) {
intBuffer.put(...); // writing the buffer from managed code
}
// ...
synchronized (obj) {
callNativeCode2(); // a JNI call; writing the buffer from C++ native code
}
}