【发布时间】:2011-07-26 10:09:55
【问题描述】:
我正在后台线程中加载纹理,然后将位图发送到 GL 线程(通过 GLSurfaceView.queueEvent(...))以将其上传到显卡。为了防止在每次图像加载后进行垃圾收集,我重用了一个具有二维功能的位图来发送纹理以打开 gl。
这就是问题所在,这个位图有时会被覆盖,因为工作线程和 GL 线程互相争斗。据我了解,不可能在一个线程(工作者)中获得锁并在另一个线程(GL)中解锁它。所以我提出了这样的解决方案(我的线程是 HandlerThread):
public boolean handleMessage(Message msg) {
switch(msg.what) {
case MESSAGE_FROM_MAIN_THREAD:
m_Lock.lock();
loadTextureFromAssets(msg.obj.toString(), msg.arg1);
break;
case MESSAGE_FROM_GL_THREAD:
m_Lock.unlock();
break;
}
return true;
}
m_Lock 是一个可重入锁。但这仍然不起作用,有时纹理会重复(或被下一个纹理部分覆盖)。看起来解锁是按后进先出顺序...
除了为每个加载的纹理创建一个新的位图并导致 GC 之外,还有什么想法吗? ...它可以解决几乎所有情况,有两个位图用于加载纹理并在它们之间切换,但这不是 100% 正确的。我想通过适当的线程同步来解决这个问题。
【问题讨论】:
标签: java android multithreading concurrency locking