1. 程式人生 > >對Unity中的多執行緒的一些理解

對Unity中的多執行緒的一些理解

大多數遊戲引擎都是單執行緒的,Unity也不例外。為什麼使用單執行緒,原因主要為:遊戲中畫面更新和邏輯更新的時間點必須有確定性,必須嚴格按照幀序列進行同步。當然,多執行緒也能實現,但是同步問題比較麻煩,會加大程式設計難度。Unity中有大量的非同步機制,比如:非同步載入資源,非同步載入場景。SceneManager.LoadSceneAsync("xxx");這段程式碼就是非同步載入場景。(非同步載入場景一般是在一個loading場景中進行,載入完成後再轉換到非同步載入好的場景中)那麼Unity中的非同步載入是不是用多執行緒實現的呢?答案不是,Unity中非同步載入機制使用的協程來實現(對於協程和執行緒的具體分析,將在其他部分)。協程並不是執行緒,協程也是在Unity主執行緒中被呼叫的,呼叫的時機和次數,程式設計師可以通過編碼確定。那麼在Unity中能不能使用多執行緒呢?我在Unity中第一次用到多執行緒,是在學習客戶端和伺服器端Socket通訊的時候,在建立socket連線之後,在客戶端,使用了BeginReceive這個方法(具體分析在其他部分),這個方法是在System.Net.Sockets中定義的。使用這個方法不用手動開啟執行緒,這個方法使用的執行緒是用C#執行緒池實現的。在Unity中合理的使用多執行緒,可以提高CPU的利用率那麼在哪些場景下才是合理的在Unity中使用多執行緒呢?1.網路通訊。2.需要處理複雜演算法的計算時。3.複雜密集的I/O操作。4.Unity3D的NativePlugin中可以新建子執行緒。通過NativePlugin可以接入移動端iOS與Android中的成熟庫,可以是Objective C, Java, C++三種語言交叉混合的方式組成NativePlugin,然後使用Android或者iOS的SDK開闢子執行緒。
(這裡的知識我是直接複製別人的參考部落格:https://www.cnblogs.com/yangxiaohang/articles/6505302.html,我並不是很瞭解,以後學習到的時候再補充。)使用多執行緒時有一些限制:1.UnityEngine中的API物件不能在子執行緒中使用。2.UnityEngine總定義的基本資料結構可以使用,(如float,int,struct可以使用)。而texture2d不可以,因為它是根父類是UnityEngine.Object。簡單來說,就是不是畫面更新,不是常規的邏輯更新。這是我參考許多前輩的心得,加上自己理解寫的,肯定有很多不足,歡迎指出錯誤。在我學習深入,有所得之後,我也會逐漸完善這些內容。

相關推薦

String在執行一些簡單認識

  最近在看多執行緒,synchronized程式碼塊時候說到用String物件來當作鎖,然後說最好不要用String物件來當作鎖,這是為什麼了?可以先看一段程式。 public class St

Android執行通訊:Handler的理解

Android中的Handler Android中Handler在我理解主要是為了解決執行緒間通訊。 使用Android的Handler機制主要要了解幾個類: Looper: 一個執行緒對應一個或者0個Looper,主執行緒在ActivityThread的時候會預設建立一個L

執行理解和分類

一、多執行緒的定義和使用資訊: 多執行緒是一個比較輕量級的方法來實現單個應用程式內多個程式碼執行路徑 在系統級別內,程式並排執行,程式分配到每個程式的執行時間是基於該程式的所需時間和其他程式的所需時間來決定的。 然而,在每個程式內部,存在一個或者多個執行執行緒,它同

Python執行理解和使用(一)Threadingjoin()函式的理解

1. 多執行緒的概念 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度  程式的執行速

談談你執行理解

執行緒是由一個主執行緒和很多個子執行緒組成的,主執行緒消失,子執行緒也會消失,但是子執行緒消失其中一個主執行緒不會消失執行緒的生命週期分為5個步驟像人的一生一樣,這5個步驟分別對應了5個方法新生-->啟動-->執行-->阻塞-->銷燬繼承Thread類

C# Winform專案執行環境下, 如何跨執行Window窗體控制元件進行安全訪問?

請嘗試執行這段程式碼, 結果你會發現微軟開發工具會提示, Tb_Text.Text = int_Index.ToString(); 涉及"對Windows窗體控制元件進行執行緒安全呼叫", 並給瞭如下的解決方案:https://msdn.microsoft.com/zh-cn/library/ms171728

java執行理解

在理解多執行緒之前我們要理解程序和執行緒: 程序指每個獨立程式在計算機上的一次執行活動,例如QQ,360管家 執行緒就是一個程式內部的一條執行路徑,如果一個程式中可以同一時間執行多個執行緒,我們就說這個程式是支援多執行緒的;比如迅雷下載軟體可以同時下載多個任務。 什麼事

JAVA 執行理解

所謂多執行緒,就是計算機同時做幾件事,對外表現的是同時完成。 實現方法 在 JAVA 中就非常比較簡單的了,只需要將新建的類實現 runable 方法,在類中的 run 方法中寫自己要完成的事

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

觀察者模式執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

執行理解思路梳理 + synchronized與Lock 的比較

多執行緒的理解思路梳理 + synchronized與Lock 的比較 理解多執行緒的根本:資源問題與鎖的物件 synchronized的理解 附1:生產者消費者實現程式碼 理解Threa

Java執行深度理解

深入理解多執行緒                                        

Spring4.x執行使用

直接上程式碼: 一:配置類 import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springfram

java執行一定快嗎?看完就知道!!!

理解上下文切換   即使是單核處理器也支援多執行緒執行程式碼,CPU通過每個執行緒分配CPU時間片來實現這個機制.時間片是CPU分配給多個執行緒的時間,因為時間片非常短,所以CPU通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms).  

Python執行總結

Python中的多執行緒 多執行緒 一個程序中有多個執行緒就是多執行緒。 一個程序中至少有一個執行緒,並作為程式的入口,這個就是主執行緒。一個程序至少有一個主程序,其他執行緒稱為工作執行緒。 執行緒安全:執行緒執行一段程式碼,不會產生不確定的結果,那這段程式碼就是執行緒安全。(例如pr

關於使用繼承QObject實現執行理解——Qt推薦的方法

概念 多執行緒的使用主要是為了處理比較耗時的過程。這可以用以下圖來形象地描述: 目前,由於繼承QObject的多執行緒實現方法更加靈活,Qt官方推薦使用該方法實現多執行緒。 想用圖來描述實現的過程,發現也不好表達,將就著看吧: 步驟 1、創鍵一個繼承於 QObje

python(2.7)執行使用舉例

python(2.7)中多執行緒使用舉例 python27中多執行緒使用舉例 下邊的程式碼都不難理解,不做多餘解釋。唯一有困惑的地方已經在原始碼中註釋說明。這裡也不做多執行緒編碼知識的講解。把這幾種形式(主要是第三種)練成muscle mem

python 執行理解

python多執行緒就是幹(同時做兩件事或者多件事),不只是python,很多程式語言都有多執行緒這個功能。我們一步一步來,先一心一用。 1、單執行緒(一心一用) import time import threading # 左手畫圓 def draw_circle(cost): p

python執行event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

event是python中一個特有的標誌位方法,他一共有三種方法 1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定 2.event.set():設定標誌位 3.event.clear():清除標誌位 這一種機制很

簡談單執行執行理解

JS的單執行緒 JS語言的特點之一就是單執行緒,簡而言之就是同一時間只能做一件事,假設JS是多執行緒,一個執行緒在某個節點上新增內容,另一個執行緒刪除了這個節點,這時就看到了問題所在了,但是H5提出了Web Worker標準,允許js指令碼建立多個執行緒,但是子執行緒完全受主執行緒的控制,而且你不