AssetBundle02

首先附上原文鏈接:https://unity3d.com/cn/learn/tutorials/topics/best-practices/assets-objects-and-serialization

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Assets, Objects和序列化

? ? ? ?這是關(guān)于Unity 5中的Asset,Resources和資源管理的系列文章的第二章骗露。

? ? ? ? 本章涵蓋了Unity序列化系統(tǒng)的深層本質(zhì)和Unity如何在編輯器和運(yùn)行時(shí)在不同Objects之間維持穩(wěn)固的關(guān)系漱牵。同時(shí)也討論了Object和Asset之間的技術(shù)區(qū)別。文章的主題涵蓋了基本概念秘蛇,用于理解怎樣有效的在Unity中加載和卸載資源。正確的Asset管理對(duì)于縮短加載時(shí)間和減少內(nèi)存占用至關(guān)重要匙瘪。


1.1內(nèi)部的Asset和Object

? ? ? ? 要想理解怎樣的在Unity中正確的管理數(shù)據(jù)索昂,重要的是去理解Unity是怎樣識(shí)別和序列化數(shù)據(jù)的。第一個(gè)關(guān)鍵點(diǎn)是Asset和UnityEngine.Objects之間的區(qū)別俺夕。

? ? ? ? 一個(gè)Asset是磁盤上的一個(gè)文件递递,存儲(chǔ)在Unity項(xiàng)目的Assets文件夾中喷橙。紋理,3D模型登舞,或是音頻片段是Asset的常見類型贰逾。一些Asset包含了Unity原生格式的數(shù)據(jù),比如說(shuō)material菠秒。其他的Asset需要被處理成原生格式疙剑,比如FBX文件。

? ? ? ? 一個(gè)UnityEngine.Object践叠,或是有一個(gè)大寫‘O’的Object言缤,是用來(lái)統(tǒng)一的描述特定資源實(shí)例的一些序列化數(shù)據(jù),它可以是Unity引擎使用的任何類型的資源禁灼,比如mesh,sprite,AudioClip或是AnimationClip管挟。所有的Object是UnityEngine.Object基類的子類。

? ? ? ? 雖然大多數(shù)Object類型都是內(nèi)置的弄捕,但有兩種特殊類型僻孝。

? ? ? ? 1.一個(gè)ScriptableObject給開發(fā)人員可以定義自己的數(shù)據(jù)類型提供了一個(gè)方便的系統(tǒng)。這些類型可以通過(guò)Unity進(jìn)行自然的序列化和反序列化守谓,并在Unity編輯器的Inspector窗口中進(jìn)行操作穿铆。

? ? ? ? 2.一個(gè)MonoBehaviour提供了一個(gè)鏈接到MonoScript的包裝。MonoScript是Unity用來(lái)在特定程序集和名稱空間內(nèi)保持對(duì)特定腳本類的引用的內(nèi)部數(shù)據(jù)類型斋荞。MonoScript中并沒(méi)有包含任何實(shí)際的可執(zhí)行代碼荞雏。

? ? ? ? ? Asset和Object之間有一對(duì)多的關(guān)系; 也就是說(shuō),任何給定的Asset文件都包含一個(gè)或多個(gè)Object平酿。


1.2Object之間的引用

? ? ? ? 所有UnityEngine.Object都可以引用其他UnityEngine.Object凤优。這些其他的Object也許包含在同樣的Asset文件中,或許從其他Asset文件中導(dǎo)入蜈彼。比如說(shuō)一個(gè)material的Object經(jīng)常有一個(gè)或者更多個(gè)texture的Object的引用别洪。這些texture的Object通常從一個(gè)或多個(gè)texture的Asset文件(如PNG或JPG)導(dǎo)入。

? ? ? ? 在序列化時(shí)柳刮,這些引用由兩個(gè)數(shù)據(jù)組成挖垛,一個(gè)File GUID和一個(gè)Local ID。File GUID標(biāo)識(shí)了存儲(chǔ)目標(biāo)資源的Asset文件秉颗。一個(gè)局部與眾不同的(AA Local ID在同一個(gè)Asset文件中與其他Local ID不同)Local ID標(biāo)識(shí)了一個(gè)Asset文件中的每個(gè)Object痢毒,因?yàn)橐粋€(gè)Asset文件可能包含多個(gè)Object。

? ? ? ? File GUID存儲(chǔ)在.meta文件中蚕甥。這些.meta文件通常在Unity第一次導(dǎo)入Asset時(shí)生成哪替,并且和Asset存儲(chǔ)在同一個(gè)文件目錄下。

? ? ? ? 上述的標(biāo)識(shí)和引用系統(tǒng)可以在text編輯器中看到菇怀,創(chuàng)建一個(gè)新的Unity項(xiàng)目并更改其編輯器設(shè)置凭舶,顯示可見meta文件并將Asset序列化為文本晌块。創(chuàng)建一個(gè)material并且向項(xiàng)目中導(dǎo)入一個(gè)texture,將material指定給一個(gè)在場(chǎng)景中的cube并且保存場(chǎng)景帅霜。

? ? ? ? 使用text編輯器打開與material關(guān)聯(lián)的.meta文件匆背。標(biāo)有“guid”的行將出現(xiàn)在文件頂部附近,這一行定義了material的Asset的File GUID。要找到Local ID身冀,使用text編輯器打開material文件钝尸,material的Object將會(huì)是這樣的:

--- !u!21 &2100000

Material:

serializedVersion: 3

... more data …

? ? ? ?在上面的例子中,以&符號(hào)開頭的數(shù)字是material的Local ID搂根。如果此material的Object位于由File GUID“abcdefg”標(biāo)識(shí)的Asset內(nèi)珍促,則material的Object可以被唯一標(biāo)識(shí)為File GUID“abcdefg”和Local ID“2100000”的組合。


1.3為什么需要File GUID和Local ID剩愧?

? ? ? ?為什么Unity的File GUID和Local ID系統(tǒng)是必需的猪叙?答案是健壯性,以及提供一個(gè)靈活的且獨(dú)立于平臺(tái)的工作流程仁卷。

? ? ? ? File GUID提供文件特定位置的抽象穴翩。只要特定的File GUID可以與特定的文件相關(guān)聯(lián),那么該文件在磁盤上的位置就變得無(wú)關(guān)緊要五督。該文件可以自由移動(dòng),而無(wú)需更新引用該文件的所有Object瓶殃。

? ? ? ? 由于任何給定的Asset文件可能包含(或通過(guò)導(dǎo)入生成)多個(gè)UnityEngine.Object資源充包,因此需要Local ID來(lái)明確區(qū)分每個(gè)不同的對(duì)象。

? ? ? ? 如果與Asset文件關(guān)聯(lián)的File GUID丟失遥椿,那么所有引用該Asset文件Object的引用也將丟失基矮。這就是為什么.meta文件必須與相關(guān)的Asset文件存儲(chǔ)在相同的文件名和相同的文件夾中是非常重要的。請(qǐng)注意冠场,Unity會(huì)重新生成已刪除或錯(cuò)位的.meta文件家浇。

? ? ? ? Unity編輯器具有到已知File GUID的特定文件路徑的映射。無(wú)論加載或?qū)階sset時(shí)都會(huì)記錄映射條目碴裙。映射條目將Asset的特定路徑與Asset的File GUID相連钢悲。如果Unity編輯器在打開時(shí),一個(gè).meta文件丟失但是Asset路徑?jīng)]有改變舔株,編輯器便可以確定該Asset保持有相同的File GUID莺琳。

? ? ? ? 如果Unity編輯器是關(guān)閉的,這時(shí)如果.meta文件丟失或是移動(dòng)Asset文件路徑時(shí)沒(méi)有將.meta文件跟隨一起移動(dòng)载慈,那么所有Object對(duì)于該Asset的引用關(guān)系都將被打破惭等。


1.4復(fù)合Asset和導(dǎo)入器

? ? ? ? 正如“內(nèi)部的Asset和Object”部分提到的,非原生的Asset類型必須被導(dǎo)入進(jìn)Unity办铡,這是通過(guò)一個(gè)Asset導(dǎo)入器完成的辞做。雖然這些導(dǎo)入器是自動(dòng)執(zhí)行的琳要,但是其也會(huì)通過(guò)AssetImporter這個(gè)API暴露給腳本。比如秤茅,TextureImporter這個(gè)API可以在導(dǎo)入單獨(dú)的Texture的Asset時(shí)(比如說(shuō)PNG文件)稚补,給文件提供設(shè)置。

? ? ? ? 導(dǎo)入過(guò)程的結(jié)果是一個(gè)或多個(gè)UnityEngine.Objects嫂伞。這些在Unity編輯器下可見的在一個(gè)父Asset下的多個(gè)子Asset孔厉,比如說(shuō)多個(gè)Sprite嵌套在一個(gè)作為一個(gè)sprite圖集導(dǎo)入的texture的Asset之下。所有這些Object將會(huì)分享一個(gè)File GUID帖努,因?yàn)樗鼈兊脑磾?shù)據(jù)存儲(chǔ)在相同的資產(chǎn)文件中撰豺。它們將通過(guò)Local ID在導(dǎo)入的texture Asset中進(jìn)行區(qū)分。

? ? ? ? 導(dǎo)入過(guò)程將源Asset轉(zhuǎn)換為適合在Unity編輯器中選擇的目標(biāo)平臺(tái)的格式拼余。導(dǎo)入過(guò)程可以包括許多重量級(jí)操作污桦,例如紋理壓縮。由于這通常是一個(gè)耗時(shí)的過(guò)程匙监,因此導(dǎo)入的Asset會(huì)緩存在Library文件夾中凡橱,無(wú)需在下次編輯器啟動(dòng)時(shí)再次重新導(dǎo)入Asset。

? ? ? ? 具體來(lái)說(shuō)亭姥,導(dǎo)入過(guò)程的結(jié)果存儲(chǔ)在一個(gè)名為該Asset的File GUID的前兩位的文件夾中稼钩。該文件夾存儲(chǔ)在Library/metadata/文件夾內(nèi)。Asset中的單個(gè)Object被序列化為一個(gè)與Asset的File GUID名稱相同的二進(jìn)制文件达罗。

? ? ? ? 此流程適用于所有Asset坝撑,而不僅僅是非本地Asset。本地Asset不需要冗長(zhǎng)的轉(zhuǎn)換過(guò)程或重新序列化粮揉。


1.5序列化和實(shí)例

? ? ? ? 雖然File GUID和Local ID是健壯的巡李,但GUID相對(duì)速度較慢,運(yùn)行時(shí)需要更高性能的系統(tǒng)扶认。Unity內(nèi)部持有一個(gè)緩存(在內(nèi)部侨拦,這個(gè)緩存被稱為PersistentManager),將File GUID和Local ID轉(zhuǎn)換為簡(jiǎn)單的辐宾、期間唯一的整數(shù)狱从。它們被稱為Instance ID,當(dāng)新Object被注冊(cè)進(jìn)緩存的時(shí)候叠纹,它們被分配為一個(gè)簡(jiǎn)單的單向遞增的排序矫夯。

? ? ? ? 緩存持有給定的Instance ID、File GUID和Local ID之間的映射關(guān)系來(lái)區(qū)分Object的本地元數(shù)據(jù)吊洼,以及Object在內(nèi)存中的實(shí)例(如果有)训貌。這保證了UnityEngine.Object之間互相持有引用。解析Instance ID引用可以快速得到由Instance ID表示的加載Object。如果目標(biāo)Object尚未加載递沪,則File GUID和Local ID被解析為Object的源數(shù)據(jù)豺鼻,從而使Unity能夠及時(shí)加載對(duì)象(JIT)。

? ? ? ? 在啟動(dòng)時(shí)款慨,工程(也就是構(gòu)建場(chǎng)景所引用的)會(huì)立即將包含所有Object數(shù)據(jù)的Instance ID迅速實(shí)例化儒飒,也包含Resources文件夾中的所有Object佩捞。當(dāng)新的Asset在運(yùn)行時(shí)導(dǎo)入的時(shí)候(在運(yùn)行時(shí)Asset被創(chuàng)建的例子是一個(gè)Texture2D類型的Object在腳本中被創(chuàng)建筒狠,比如:var myTexture = new Texture2D(1024, 768); )溜徙,或是Object從AssetBundle中加載的時(shí)候陵叽,這些額外的條目會(huì)被添加進(jìn)緩存。Instance ID條目唯一從緩存中移除的情況是當(dāng)一個(gè)提供對(duì)指定的File GUID和Local ID的AssetBundle卸載的時(shí)候筒愚。發(fā)生這種情況時(shí)贡歧,Instance ID怨绣、File GUID和Local ID之間的映射關(guān)系將被刪除來(lái)節(jié)省內(nèi)存整胃。如果重新加載這個(gè)AssetBundle時(shí)颗圣,則將為從重新加載的AssetBundle中加載的每個(gè)Object創(chuàng)建一個(gè)新的Instance ID。

? ? ? ? 有關(guān)卸載AssetBundles的含義的更深入討論屁使,請(qǐng)參閱AssetBundle使用模式文章中的管理已加載Asset部分在岂。

? ? ? ? 在特定的平臺(tái)上,某些事件可能會(huì)強(qiáng)制Object從內(nèi)存中刪除內(nèi)存蛮寂。比如說(shuō)IOS平臺(tái)上的圖形Asset當(dāng)App暫停時(shí)會(huì)從圖形內(nèi)存中卸載蔽午,如果這些Object來(lái)自一個(gè)被卸載的AssetBundle,Unity將無(wú)法重新加載這些Object的源數(shù)據(jù)酬蹋。這些Object任何現(xiàn)存的引用也會(huì)變得無(wú)效及老。在剛才的例子中,場(chǎng)景可能看起來(lái)有不可見的網(wǎng)格或是洋紅色的texture除嘹。

? ? ? ? 實(shí)現(xiàn)注意事項(xiàng):在運(yùn)行時(shí)写半,上述控制流程不是字面上的精確的岸蜗。當(dāng)有比較重的加載任務(wù)時(shí)尉咕,比較File GUID和Local ID將會(huì)性能不足。在構(gòu)建Unity項(xiàng)目時(shí)璃岳,F(xiàn)ile GUID和Local ID會(huì)被確切的映射成一個(gè)簡(jiǎn)單的格式年缎。然而,這個(gè)概念仍然是完全相同的铃慷,并且在運(yùn)行時(shí)考慮用File GUID和Local ID保持一個(gè)有用的類比单芜。這也是Asset的File GUID在運(yùn)行時(shí)無(wú)法查詢的原因。


1.6 MonoScripts

? ? ? ? 理解一個(gè)MonoBehaviour有一個(gè)MonoScript引用是重要的犁柜,MonoScript僅僅包含了用來(lái)定位特定腳本類的信息洲鸠。任何類型的Object都不包含腳本類的可執(zhí)行代碼。

? ? ? ? MonoScript包含三個(gè)字符串:程序集名稱,類名稱和命名空間扒腕。

? ? ? ? 當(dāng)構(gòu)建一個(gè)項(xiàng)目的時(shí)候绢淀,Unity會(huì)將Assets文件夾中的所有零散腳本文件編譯為Mono程序集。Plugins子文件夾外的C#腳本被放置到Assembly-CSharp.dll中瘾腰。Plugins子文件夾中的腳本放置在Assembly-CSharp-firstpass.dll中皆的,諸如此類。此外蹋盆,Unity 2017.3還引入了定義用戶自定義托管程序集的功能费薄。

? ? ? ? 這些程序集以及預(yù)先構(gòu)建好的的程序集DLL文件都包含在最終的Unity應(yīng)用程序中。它們也是MonoScript引用的程序集栖雾。與其他資源不同楞抡,包含在Unity應(yīng)用程序中的所有程序集都在應(yīng)用程序啟動(dòng)時(shí)加載。

? ? ? ? MonoScript的Object就是為什么一個(gè)AssetBundle(或是一個(gè)場(chǎng)景或是一個(gè)prefab)并不實(shí)際包含可執(zhí)行代碼在任何AssetBundle岩灭、場(chǎng)景或是prefab的MonoBehaviour組件的原因拌倍。這就允許了不同的MonoBehaviour來(lái)引用特定的共享類,甚至這些MonoBehaviour在不同的AssetBundle中噪径。


1.7? 資源生命周期

? ? ? ? 為了減少加載時(shí)間并且管理一個(gè)應(yīng)用程序的內(nèi)存占用空間柱恤,了解UnityEngine.Object的資源生命周期非常重要。Object在特定和定義的時(shí)間從內(nèi)存中加載/卸載找爱。

? ? ? ? 在以下情況下會(huì)自動(dòng)加載Object:

????????1.映射到該Object的Instance ID被間接引用

? ? ? ? 2.該Object目前沒(méi)有加載到內(nèi)存中

? ? ? ? 3.Object的源數(shù)據(jù)可以被定位

? ? ? ? Object也可以在腳本中創(chuàng)建它們時(shí)或者調(diào)用資源加載API時(shí)(比如AssetBundle.LoadAsset)被明確的加載梗顺。加載Object后,Unity會(huì)嘗試通過(guò)將每個(gè)引用的File GUID和Local ID轉(zhuǎn)換為Instance ID來(lái)解析任何引用车摄。如果下面兩個(gè)條件為真寺谤,Object將會(huì)在其Instance ID被間接引用時(shí)第一時(shí)間加載:

? ? ? ? 1.該Instance ID引用了一個(gè)當(dāng)前未加載的Object

? ? ? ? 2.該Instance ID有一個(gè)有效的File GUID和Local ID注冊(cè)在緩存中

? ? ? ? 這通常在其自身的引用被加載并解析后很快發(fā)生。

? ? ? ? 如果一個(gè)File GUID和Local ID沒(méi)有Instance ID吮播,或是帶有未加載Object的Instance ID引用了無(wú)效的File GUID和Local ID变屁,則將保留該引用,但實(shí)際的對(duì)象不會(huì)被加載意狠。這在Unity編輯器中顯示為“(Missing)”粟关。在正在運(yùn)行的應(yīng)用程序中或在場(chǎng)景視圖中,“(Missing)”的Object將以不同的方式顯示环戈,具體取決于它們的類型闷板。例如,mesh看起來(lái)是不可見的院塞,而texture可能看起來(lái)是品紅色的遮晚。

? ? ? ? 對(duì)象在三種特定情況下卸載:

? ? ? ? ·當(dāng)未使用的Asset清理發(fā)生時(shí),Object將會(huì)被自動(dòng)卸載拦止。這個(gè)進(jìn)程將會(huì)在場(chǎng)景以破壞性方式切換時(shí)(即SceneManager.LoadScene被非附加調(diào)用時(shí))或是當(dāng)腳本執(zhí)行Resources.UnloadUnusedAssets這個(gè)API時(shí)自動(dòng)觸發(fā)县遣。該進(jìn)程僅卸載未引用的Object,比如說(shuō)沒(méi)有Mono變量引用此Object,并且沒(méi)有其他激活的Object引用到此變量萧求。此外括蝠,請(qǐng)注意,任何標(biāo)有HideFlags.DontUnloadUnusedAsset和HideFlags.HideAndDontSave的Object都不會(huì)被卸載饭聚。

? ? ? ? ·可以通過(guò)調(diào)用Resources.UnloadAsset這個(gè)API顯式地卸Resources文件夾中的對(duì)象忌警。這些對(duì)象的Instabce ID保持有效,并且仍將包含有效的File GUID和Local ID條目秒梳。如果任何Mono變量或其他Object持有對(duì)使用Resources.UnloadAsset卸載的Object的引用法绵,那么只要任何活動(dòng)引用被間接引用,就會(huì)重新加載該Object酪碘。

? ? ? ? ·源自AssetBundles的Object在調(diào)用AssetBundle.Unload(true)這個(gè)API時(shí)會(huì)自動(dòng)并立即卸載朋譬。這將使對(duì)象的Instance ID的File GUID和Local ID無(wú)效,并且對(duì)卸載的Object的任何實(shí)時(shí)引用都將變成“(Missing)”引用兴垦。C#腳本嘗試訪問(wèn)卸載對(duì)象上的方法或?qū)傩詫a(chǎn)生NullReferenceException徙赢。

? ? ? ? 如果調(diào)用了AssetBundle.Unload(false),則來(lái)自未加載的AssetBundle的實(shí)時(shí)Object不會(huì)被銷毀探越,但Unity會(huì)使其Instance ID的File GUID和Local ID引用無(wú)效狡赐。如果這些Object被從內(nèi)存中卸載并且有對(duì)這些Object的實(shí)時(shí)引用保留,Unity將不會(huì)重新加載這些Object钦幔。(最常見的情況是枕屉,在運(yùn)行時(shí)將Object沒(méi)有卸載就從內(nèi)存中移除時(shí),Unity會(huì)失去對(duì)其圖形上下文的控制權(quán)鲤氢。當(dāng)移動(dòng)應(yīng)用程序被暫停并且該應(yīng)用程序被強(qiáng)制置于后臺(tái)時(shí)搀擂,可能會(huì)發(fā)生這種情況。在這種情況下卷玉,移動(dòng)操作系統(tǒng)通常會(huì)從GPU內(nèi)存中清除所有圖形資源哨颂。當(dāng)應(yīng)用程序返回到激活時(shí),Unity必須在場(chǎng)景渲染恢復(fù)之前將所有需要的紋理相种,著色器和網(wǎng)格重新加載到GPU威恼。)


1.8加載大的層級(jí)結(jié)構(gòu)

? ? ? ? 在序列化Unity GameObjects的層級(jí)結(jié)構(gòu)時(shí),例如在預(yù)制體序列化時(shí)蚂子,請(qǐng)務(wù)必記住整個(gè)層級(jí)結(jié)構(gòu)將完全序列化沃测。也就是說(shuō)缭黔,層級(jí)結(jié)構(gòu)中的每個(gè)GameObject和Component將分別在序列化數(shù)據(jù)中表示食茎。這對(duì)加載和實(shí)例化GameObject的層級(jí)結(jié)構(gòu)所需的時(shí)間有著奇妙的影響。

? ? ? ? 在創(chuàng)建GameObject層級(jí)結(jié)構(gòu)時(shí)馏谨,CPU時(shí)間花費(fèi)在幾個(gè)不同的方面:

? ? ? ? ·讀取源數(shù)據(jù)(來(lái)自存儲(chǔ)别渔,來(lái)自AssetBundle,來(lái)自另一個(gè)GameObject等

? ? ? ? ·設(shè)置新的Transform的父子關(guān)系

? ? ? ? ·實(shí)例化新的GameObjects和組件

? ? ? ? ·在主線程中喚醒新的GameObjects和組件

? ? ? ? 無(wú)論層級(jí)結(jié)構(gòu)是從現(xiàn)有的層級(jí)結(jié)構(gòu)中克隆還是從存儲(chǔ)中加載,后三種時(shí)間成本通常是不變的哎媚。然而讀取源數(shù)據(jù)的時(shí)間隨著組件和GameObjects序列化到層次結(jié)構(gòu)中的數(shù)量的增加而線性增加喇伯,并且也乘以數(shù)據(jù)源的速度。

? ? ? ? 在目前所有的平臺(tái)上拨与,從內(nèi)存中任意地方讀取數(shù)據(jù)比從存儲(chǔ)設(shè)備載入數(shù)據(jù)要快得多稻据。此外,可用的存儲(chǔ)介質(zhì)的性能特征在不同平臺(tái)之間差異很大买喧。因此捻悯,在硬盤讀取速度慢的平臺(tái)上上加載預(yù)制體,從存儲(chǔ)中讀取預(yù)制體序列化數(shù)據(jù)的時(shí)間可能會(huì)大大超過(guò)實(shí)例化預(yù)制體的時(shí)間淤毛。也就是說(shuō)今缚,加載操作的性能成本必然與硬盤存儲(chǔ)I/O時(shí)間有關(guān)。

? ? ? ? 如前所述低淡,當(dāng)序列化一個(gè)整體預(yù)制體時(shí)姓言,每個(gè)GameObject和組件的數(shù)據(jù)都會(huì)被單獨(dú)序列化,這可能會(huì)導(dǎo)致數(shù)據(jù)重復(fù)蔗蹋。例如何荚,具有30個(gè)相同元素的UI界面將具有相同元素序列化30次,產(chǎn)生大量的二進(jìn)制數(shù)據(jù)猪杭。在加載時(shí)兽泣,這30個(gè)重復(fù)的元素身上的所有的GameObject和組件數(shù)據(jù)必須在被傳送的到新Object實(shí)例化之前從硬盤中讀取。這個(gè)文件讀取時(shí)間是實(shí)例化大型預(yù)制體的總成本的重要組成部分胁孙。大的層級(jí)結(jié)構(gòu)應(yīng)該使用模塊化方式實(shí)現(xiàn)實(shí)例化唠倦,然后在運(yùn)行時(shí)縫合在一起。

Unity 5.4注意: Unity 5.4改變了內(nèi)存中Transform的表示涮较。每個(gè)根Transform的整個(gè)子層級(jí)結(jié)構(gòu)都存儲(chǔ)在緊湊稠鼻,連續(xù)的內(nèi)存區(qū)域中。在實(shí)例化新的GameObjects時(shí)狂票,它們會(huì)立即重新排列到另一個(gè)層級(jí)結(jié)構(gòu)中候齿,請(qǐng)考慮使用接受父Transform參數(shù)的新GameObject.Instantiate()重載。使用此重載可以避免為新的GameObject分配根Transform層級(jí)結(jié)構(gòu)闺属。在測(cè)試中慌盯,這加快了實(shí)例化操作所需的時(shí)間約5-10%。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掂器,一起剝皮案震驚了整個(gè)濱河市亚皂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌国瓮,老刑警劉巖灭必,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞谱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡禁漓,警方通過(guò)查閱死者的電腦和手機(jī)跟衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)播歼,“玉大人伶跷,你說(shuō)我怎么就攤上這事∶啬” “怎么了撩穿?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谒撼。 經(jīng)常有香客問(wèn)我食寡,道長(zhǎng),這世上最難降的妖魔是什么廓潜? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任抵皱,我火速辦了婚禮,結(jié)果婚禮上辩蛋,老公的妹妹穿的比我還像新娘呻畸。我一直安慰自己,他們只是感情好悼院,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布伤为。 她就那樣靜靜地躺著,像睡著了一般据途。 火紅的嫁衣襯著肌膚如雪绞愚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天颖医,我揣著相機(jī)與錄音位衩,去河邊找鬼。 笑死熔萧,一個(gè)胖子當(dāng)著我的面吹牛糖驴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佛致,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼贮缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俺榆?” 一聲冷哼從身側(cè)響起感昼,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肋演,沒(méi)想到半個(gè)月后抑诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爹殊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蜕乡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗夸。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡层玲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出反症,到底是詐尸還是另有隱情辛块,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布铅碍,位于F島的核電站润绵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胞谈。R本人自食惡果不足惜尘盼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦绳。 院中可真熱鬧卿捎,春花似錦、人聲如沸径密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)享扔。三九已至底桂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惧眠,已是汗流浹背戚啥。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锉试,地道東北人猫十。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呆盖,于是被迫代替她去往敵國(guó)和親拖云。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • 首先附上原文鏈接:https://unity3d.com/learn/tutorials/topics/best-...
    Bonging閱讀 1,191評(píng)論 0 0
  • 翻譯:莫銘原文地址:AssetBundle usage patterns 本系列中的上一篇文章覆蓋了AssetBu...
    莫銘閱讀 5,283評(píng)論 1 12
  • 這一部分主要是對(duì)Unity的Resources系統(tǒng)和AssetBundle系統(tǒng)進(jìn)行深入討論应又。 分為四個(gè)部分: 有關(guān)...
    Wenchao閱讀 2,014評(píng)論 0 1
  • 這部分主要討論了AssetBundle的如下知識(shí): AssetBundle的基礎(chǔ)知識(shí) 使用AssetBundle的...
    Wenchao閱讀 1,620評(píng)論 0 5
  • Unity的資源加載及管理宙项,基礎(chǔ)很重要。此篇文章作為近期梳理項(xiàng)目?jī)?nèi)資源管理器的一個(gè)小總結(jié)株扛,嘗試盡量用人話將Unit...
    某人在閱讀 20,298評(píng)論 8 44