Unity生命周期停撞,及相關(guān)內(nèi)容

其實(shí)游戲引擎有一個基礎(chǔ)簡單理解,那就是不斷的進(jìn)行一個循環(huán)悼瓮,在這個周期循環(huán)之中會每一幀的進(jìn)行一些表現(xiàn)渲染上的處理戈毒,處理的結(jié)果就是我們看到的游戲畫面,當(dāng)然也會有各種各樣的邏輯上的處理横堡。
Unity是單線程的游戲引擎埋市,為什么要做這個限制?因?yàn)橛螒蛑羞壿嫺潞彤嬅娓碌臅r間點(diǎn)要求有確定性命贴,必須按照幀序列嚴(yán)格保持同步道宅,否則就會出現(xiàn)游戲中的對象不同步的現(xiàn)象。多線程也能保證這個效果胸蛛,但如果引入多線程污茵,會加大同步處理的難度與游戲的不穩(wěn)定性。
unity有提供腳本周期葬项,腳本的生命周期其實(shí)最最重要的就是這張圖了泞当,簡單的可以把這個理解成,這是一個單線程的幀循環(huán)民珍,每一次繪制都會重新走一遍生命周期襟士。


image.png

Awake

游戲物體實(shí)例化后并處于激活狀態(tài)時調(diào)用,即使腳本組件沒有激活也會調(diào)用嚷量,而且總是在Start()函數(shù)之前調(diào)用

OnEnable

游戲物體與腳本組件激活時調(diào)用(會反復(fù)觸發(fā))

Start

游戲物體與腳本組件處于激活狀態(tài)陋桂,在Update()運(yùn)行前調(diào)用(只調(diào)用一次,當(dāng)物體關(guān)閉激活狀態(tài)蝶溶,再打開時不會反復(fù)觸發(fā))

不同腳本間的嗜历,執(zhí)行順序:
Start是在場景所有物體的Awake與Enable全部執(zhí)行完畢后進(jìn)行調(diào)用。在unity中身坐,多腳本的加載順序是隨機(jī)的。如果想直接進(jìn)行對不同腳本Awake實(shí)例化的順序控制的話落包,可以通過Script Execution Order來進(jìn)行設(shè)置


image.png

FixedUpdate

FixedUFipdate部蛇,是每隔Time.fixedDeltaTime被調(diào)用一次。Time.fixedDeltaTime默認(rèn)是0.02s咐蝇,可以通過Edit->ProjectSettings->Time來設(shè)置涯鲁。用來處理一些物理相關(guān)的內(nèi)容,例如:給剛體加一個作用力時,你必須應(yīng)用作用力在FixedUpdate里的固定幀抹腿,而不是Update中的幀(兩者幀長不同)岛请。
一個最簡單的游戲循環(huán)大就是這樣的,其中的frameTime 相當(dāng)于警绩,Time.deltaTime,它的時間其實(shí)是不固定的


image.png

那么如何實(shí)現(xiàn)FixedUFipdate 的固定增量時間呢崇败,實(shí)現(xiàn)原理是 一個主循環(huán)中設(shè)置一個二級循環(huán),以常量時間循環(huán)(其實(shí)在上面的生命周期中可以看出來)肩祥。


image.png

所以我們可以直接設(shè)置這個Time.fixedDeltaTime后室。

Update

update跟當(dāng)前平臺的幀數(shù)有關(guān),Update是在每次渲染新的一幀的時候才會調(diào)用混狠,也就是說岸霹,這個函數(shù)的更新頻率和設(shè)備的性能有關(guān)以及被渲染的物體(可以認(rèn)為是三角形的數(shù)量)。在性能好的機(jī)器上可能fps 30将饺,差的可能小些贡避。這會導(dǎo)致同一個游戲在不同的機(jī)器上效果不一致,有的快有的慢予弧。因?yàn)閁pdate的執(zhí)行間隔不一樣了刮吧。

LateUpdate

在調(diào)用所有Update函數(shù)后調(diào)用LateUpdate。這可用于調(diào)整腳本執(zhí)行順序桌肴。例如:當(dāng)物體在Update里移動時皇筛,跟隨物體的相機(jī)可以在LateUpdate里實(shí)現(xiàn)。

線程坠七,協(xié)程 ##(游戲用到了大量的異步操作水醋,這些是怎么實(shí)現(xiàn)的嗎?)

協(xié)程是什么呢彪置?總體來說拄踪,對與Unity,它是單線程的設(shè)計(jì)拳魁,它更傾向使用time slicing(時間分片)的協(xié)程(coroutine)去完成異步任務(wù)惶桐,融合到了剛剛提到的生命周期中。

要理解協(xié)程潘懊,先回顧下線程:線程是操作系統(tǒng)級別的概念姚糊,現(xiàn)代操作系統(tǒng)都實(shí)現(xiàn)并且支持線程,線程的調(diào)度對應(yīng)用開發(fā)者是透明的授舟,開發(fā)者無法預(yù)期某線程在何時被調(diào)度執(zhí)行救恨。基于此释树,一般那種隨機(jī)出現(xiàn)的BUG肠槽,多與線程調(diào)度相關(guān)擎淤。

而協(xié)程Coroutine是編譯器級的,本質(zhì)還是一個線程時間分片去執(zhí)行代碼段秸仙。它通過**相關(guān)的代碼使得代碼段能夠?qū)崿F(xiàn)分段式的執(zhí)行嘴拢,顯式調(diào)用yield函數(shù)后才被掛起,重新開始的地方是yield關(guān)鍵字指定的寂纪,一次一定會跑到一個yield對應(yīng)的地方席吴。因?yàn)閰f(xié)程本質(zhì)上還是在主線程里執(zhí)行的,需要內(nèi)部有一個類似棧的數(shù)據(jù)結(jié)構(gòu)弊攘,當(dāng)該coroutine被掛起時要保存該coroutine的數(shù)據(jù)現(xiàn)場以便恢復(fù)執(zhí)行抢腐。

在Unity3D中,協(xié)程是可自行停止運(yùn)行 (yield)襟交,直到給定的 YieldInstruction 結(jié)束再繼續(xù)運(yùn)行的函數(shù)迈倍。 協(xié)程 (Coroutines) 的不同用途:

? yield; 在下一幀上調(diào)用所有 Update 函數(shù)后,協(xié)同程序?qū)⒗^續(xù)運(yùn)行捣域。

? yield WaitForSeconds(2); 在指定的時間延遲之后啼染,為此幀調(diào)用所有 Update 函數(shù)之后繼續(xù)運(yùn)行

? yield WaitForFixedUpdate(); 在所有腳本上調(diào)用所有 FixedUpdate 后繼續(xù)運(yùn)行

? yield WWW 完成 WWW 下載后繼續(xù)運(yùn)行。

? yield StartCoroutine(MyFunc); 連接協(xié)同程序焕梅,并等待 MyFunc coroutine 首先結(jié)束迹鹅。

也就是說,將代碼段分散在不同的幀中贞言,每次執(zhí)行一段斜棚,下一幀再執(zhí)行yield掛起的地方。

舉個例子: 在OnStart()框架函數(shù)中調(diào)用startCoroutine(GetHttpData)執(zhí)行以下代碼端该窗,其實(shí)是第一次發(fā)起網(wǎng)絡(luò)請求弟蚀,下一次執(zhí)行時則走入yield之后的代碼段繼續(xù)執(zhí)行,從而實(shí)現(xiàn)了一個時間分片的”異步”效果酗失,而不是像線程那樣在操作系統(tǒng)層面分CPU時間片去執(zhí)行义钉。

上面我們了解到了其實(shí)untiy是一個單線程的,但這些并不意味著無法在Unity中使用多線程规肴,只是需要注意使用的場景捶闸。

試想一下,如果在幀序列的主循環(huán)單線程中處理大量耗時操作拖刃,勢必會帶來游戲畫面的卡頓删壮,幀率的下降。

因此兑牡,對于不是畫面更新央碟,也不是常規(guī)的邏輯更新(指包括AI、物理碰撞发绢、角色控制這些)硬耍,而是一些其他后臺任務(wù),則可以將這個獨(dú)立出來開辟一個子線程边酒。

所以经柴,在不使用Unity SDK的前提下,確保做好主子線程的同步(采用C#中的delegate等機(jī)制)墩朦,那么是可以合理使用子線程的坯认。Unity限制使用多線程的原因主要是1.保證數(shù)據(jù)安全,2.降低編程難度氓涣。Unity在底層實(shí)現(xiàn)了線程池牛哺,引擎底層來實(shí)現(xiàn)一些可使用多線程處理的任務(wù)

概括起來,結(jié)合過往移動端的研發(fā)經(jīng)驗(yàn)劳吠,我認(rèn)為有以下幾點(diǎn)可以在子線程中處理:
  大量耗時的數(shù)據(jù)計(jì)算
  網(wǎng)絡(luò)請求
  復(fù)雜密集的I/O操作
  Unity3D的NativePlugin中可以新建子線程引润。通過NativePlugin可以接入移動端iOS與Android中的成熟庫,可以是Objective C, Java, C++三種語言交叉混合的方式組成NativePlugin痒玩,然后使用Android或者iOS的SDK開辟子線程淳附。

參考:
https://blog.csdn.net/qq_28180261/article/details/64500720
https://blog.csdn.net/Le11eL/article/details/123464876

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蠢古,隨后出現(xiàn)的幾起案子奴曙,更是在濱河造成了極大的恐慌,老刑警劉巖草讶,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽糟,死亡現(xiàn)場離奇詭異,居然都是意外死亡堕战,警方通過查閱死者的電腦和手機(jī)坤溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來践啄,“玉大人浇雹,你說我怎么就攤上這事∮旆恚” “怎么了昭灵?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伐谈。 經(jīng)常有香客問我烂完,道長,這世上最難降的妖魔是什么诵棵? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任抠蚣,我火速辦了婚禮,結(jié)果婚禮上履澳,老公的妹妹穿的比我還像新娘嘶窄。我一直安慰自己怀跛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布柄冲。 她就那樣靜靜地躺著吻谋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪现横。 梳的紋絲不亂的頭發(fā)上漓拾,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音戒祠,去河邊找鬼骇两。 笑死,一個胖子當(dāng)著我的面吹牛姜盈,可吹牛的內(nèi)容都是我干的低千。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馏颂,長吁一口氣:“原來是場噩夢啊……” “哼栋操!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饱亮,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤矾芙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后近上,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剔宪,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年壹无,在試婚紗的時候發(fā)現(xiàn)自己被綠了葱绒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗锭,死狀恐怖地淀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岖是,我是刑警寧澤帮毁,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站豺撑,受9級特大地震影響烈疚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聪轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一爷肝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦灯抛、人聲如沸金赦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽素邪。三九已至,卻和暖如春猪半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷线。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工磨确, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人声邦。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓乏奥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亥曹。 傳聞我的和親對象是個殘疾皇子邓了,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一、【Unity3D】協(xié)程Coroutine的運(yùn)用[https://blog.csdn.net/yongh701/...
    合肥黑閱讀 10,354評論 0 3
  • 一:什么是協(xié)同程序媳瞪? 答:在主線程運(yùn)行時同時開啟另一段邏輯處理骗炉,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說蛇受,開啟協(xié)程就是開啟一...
    好怕怕閱讀 3,883評論 2 23
  • 在這個降低入門門檻的大環(huán)境下,Unity 因?yàn)榭紤]到降低門檻把将,設(shè)計(jì)之初就是一個單線程轻专,不允許在另外的線程中進(jìn)行渲染...
    耳朵里有只風(fēng)閱讀 8,269評論 0 5
  • 一:什么是協(xié)同程序?答:在主線程運(yùn)行時同時開啟另一段邏輯處理察蹲,來協(xié)助當(dāng)前程序的執(zhí)行请垛。換句話說,開啟協(xié)程就是開啟一個...
    CrixalisAs閱讀 2,071評論 1 7
  • 一:什么是協(xié)同程序洽议? 在主線程運(yùn)行的同時開啟另一段邏輯處理叼屠,來協(xié)助當(dāng)前程序的執(zhí)行,協(xié)程很像多線程绞铃,但是不是多線程镜雨,...
    胤醚貔貅閱讀 2,077評論 0 13