我試圖強制執行一對Android線程之間的同步以實現遊戲編程目的。我已經分配了一個處理大多數職責的遊戲線程和一個渲染線程,它負責交換緩衝區和渲染。當我第一次詢問線程同步時,我將ConditionVariable對象稱爲強制線程阻塞直到併發任務完成的有用工具。ConditionVariable可以防止兩個線程同時運行
我的源代碼是這樣的:以正確的順序執行
...
final ConditionVariable bufferLock = new ConditionVariable();
final ConditionVariable cycleLock = new ConditionVariable();
bufferLock.open();
cycleLock.open();
Runnable bufferSwapTask = new Runnable()
{
public void run()
{
swapBuffers();
bufferLock.open();
}
};
Runnable renderTask = new Runnable()
{
public void run()
{
Log.d(TAG, "drawAll");
drawAll();
cycleLock.open();
}
};
while(!halt)
{
if(!init)
{
synchronized (userInputLock)
{
fetchUserInput();
}
processUserInput();
gameLogic();
bufferLock.block();
cycleLock.close();
renderThreadHandler.post(renderTask);
recycleDisplayObjects();
enqueueDisplayTree();
cycleLock.block();
bufferLock.close();
renderThreadHandler.post(bufferSwapTask);
}
}
...
這樣的事情,但不是我所預期的性能水平。而且,當我激活DDMS方法跟蹤時,我發現DVM實際上會中斷和阻塞每個線程,以允許其他線程恢復,以強烈暗示兩個線程僅由一個CPU處理的方式來回切換。
我已經使用ReentrantLocks很好的同時處理結果,那麼爲什麼ConditionVariable有這種效果?