之前在unity專案中,使用了loom作為返回主線程的一種工具。
loom的原理其實很巧妙,就是利用unity的update方法來執行需要在主線程中呼叫的委託。
為什麼需要在update裡操作呢,是因為update是由unity的主線程call起的,因此在update內執行的委託也一定是在主線程中執行,只不過執行前需要lock一下_queue來防止其他執行緒訪問。
但是因為在update中執行,當執行loom的runonmainthread方法時,其實依然有一定的延遲(雖然可以忽略不計),那麼有沒有更直接的辦法呢?
之前在其他部落格上看到了synchronizationcontext,也就是執行緒上下文,它可以允許往指定的執行緒中插入乙個方法,使其立刻在指定執行緒中執行。
那麼如果指定的執行緒為主執行緒,是不是就可以直接在主線程中插入乙個方法來執行了呢?既然有了思路,那麼就可以動手了。首先命名下這個工具,暫時叫做mainthreadmanager,我們要確保獲取的執行緒上下文一定是主線程的,一般是unity內的核心管理器建立時,就可以對這個mainthreadmanager進行初始化,使其獲得主線程上下文。
public class mainthreadmanager
}private static mainthreadmanager _instance;
static mainthreadmanager()
// 指定執行緒的上下文,目前用於主線程
private synchronizationcontext m_mainthreadcontext = null;
// 初始化這個管理器,使其獲得當前執行緒的上下文
public void init()
// 在主線程中插入乙個方法
public void runonmainthread(action runonmain)
), null);}}
至此,雛形也就完成了。那麼我們可以來實踐一下。
這是個測試的指令碼,如果我們直接在子執行緒中修改image的sprite,則必定丟擲異常,
那麼使用這個管理器來執行的話,也就是注釋的部分來進行主線程切換,就正常地替換了image的sprite了。
這只是乙個思路,可以根據這個工具進行更多的擴充套件,來達到更多的效果。目前就是把學習到的技巧先總結一下,以後再更深入地了解學習。
**********=warning**********===
最近發現迴圈訪問這個方法會帶來一定的效能問題,因此可能需要再深入研究一下。
如何判斷乙個執行緒是否正在執行
建立執行緒時 thread1 new mythread false thread1 freeonterminate false 不自動釋放執行緒 thread1 resume 開始執行執行緒 在execute方法中迴圈檢查terminated是否為true,如果為true,則退出迴圈.在主線程中結束...
如何判斷乙個執行緒是否正在執行
建立執行緒時 thread1 new mythread false thread1 freeonterminate false 不自動釋放執行緒 thread1 resume 開始執行執行緒 在execute方法中迴圈檢查terminated是否為true,如果為true,則退出迴圈.在主線程中結束...
如何停止乙個執行緒
停止乙個執行緒的最佳方法是讓它執行完畢,沒有辦法立即停止乙個執行緒,但你可以控制何時或什麼條件下讓他執行完畢。通過條件變數控制線程的執行,執行緒內部檢查變數狀態,外部改變變數值可控制停止執行。為保證執行緒間的即時通訊,需要使用volatile關鍵字或鎖,確保讀執行緒與寫執行緒變數狀態的一致性。pub...