新聞中心
Unity是一款廣泛使用的游戲引擎,其強(qiáng)大的游戲開(kāi)發(fā)和運(yùn)行能力在眾多游戲開(kāi)發(fā)者中深受歡迎。在游戲制作過(guò)程中,很多場(chǎng)景和游戲角色需要大量的建模,而針對(duì)這些數(shù)據(jù)的高效存儲(chǔ)和處理顯然是開(kāi)發(fā)過(guò)程中的一個(gè)關(guān)鍵問(wèn)題。因此,本文將介紹在Unity中運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù)的處理技巧。

創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
1. 數(shù)據(jù)庫(kù)的選擇
在Unity中運(yùn)行時(shí)存儲(chǔ)模型,需要選擇適合的數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù),以便在游戲運(yùn)行時(shí)快速讀取和修改數(shù)據(jù)。通常情況下,我們可以選擇SQLite、Realm、Firebase等數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)。
SQLite是一個(gè)開(kāi)源、輕量級(jí)的數(shù)據(jù)庫(kù),嵌入式型數(shù)據(jù)庫(kù),適用于移動(dòng)設(shè)備或需要本地存儲(chǔ)的應(yīng)用程序,優(yōu)點(diǎn)是易于部署和維護(hù)。Realm是一種快速的移動(dòng)數(shù)據(jù)庫(kù),具有強(qiáng)大的查詢和變換功能。Firebase是一個(gè)基于云計(jì)算的移動(dòng)和 Web 應(yīng)用程序開(kāi)發(fā)平臺(tái),不僅提供了數(shù)據(jù)庫(kù)服務(wù),還提供了用戶認(rèn)證、Crashlytics 等服務(wù)。
根據(jù)具體需求和平臺(tái)特點(diǎn)選擇適合的數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)是十分重要的。
2. 數(shù)據(jù)模型的設(shè)計(jì)
在進(jìn)行數(shù)據(jù)庫(kù)存儲(chǔ)之前,需要對(duì)數(shù)據(jù)模型進(jìn)行設(shè)計(jì)。數(shù)據(jù)模型涉及到的數(shù)據(jù)類型、關(guān)系以及需要存儲(chǔ)哪些數(shù)據(jù)等,都需要仔細(xì)考慮。在設(shè)計(jì)時(shí),需要注意數(shù)據(jù)表之間的關(guān)系配置,如一對(duì)一、一對(duì)多、多對(duì)多等,以及對(duì)應(yīng)關(guān)系的外鍵設(shè)置。設(shè)計(jì)出合理的數(shù)據(jù)模型,可以大大提高程序的效率和可維護(hù)性。
3. 數(shù)據(jù)庫(kù)的連接和操作
在Unity中,連接數(shù)據(jù)庫(kù)需要使用相應(yīng)的數(shù)據(jù)庫(kù)連接庫(kù),如Sqlite-net、Realm等。在連接數(shù)據(jù)庫(kù)之后,可以進(jìn)行數(shù)據(jù)的操作,如添加、修改、刪除和查詢等操作,以便進(jìn)行游戲的實(shí)時(shí)反饋和數(shù)據(jù)記錄。
例如,使用Sqlite-net庫(kù)時(shí),首先需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象:
SQLiteConnection connection = new SQLiteConnection(“data source=” + _sqliteDBPath);
其中_sqliteDBPath為數(shù)據(jù)庫(kù)文件路徑,然后就可以對(duì)數(shù)據(jù)進(jìn)行操作,如添加一條數(shù)據(jù):
Student stu = new Student() { Name = “Tom”, Age = 18, Grade = 3 }; //Student為數(shù)據(jù)模型對(duì)象
connection.Insert(stu);
4. 數(shù)據(jù)庫(kù)的優(yōu)化
在處理大量數(shù)據(jù)時(shí),為了提高程序效率和響應(yīng)速度,需要進(jìn)行數(shù)據(jù)庫(kù)的優(yōu)化。優(yōu)化方法主要包括索引、批量插入和事務(wù)處理。
索引是一種提高查詢效率的方法,可以加快查詢數(shù)據(jù)的速度。在創(chuàng)建數(shù)據(jù)表時(shí),可以設(shè)置相應(yīng)的索引,例如:
CREATE INDEX index_name ON table_name (column_name );
批量插入是一種提高插入數(shù)據(jù)效率的方法,可以減少插入操作的次數(shù)。例如,使用Sqlite-net庫(kù)時(shí)可以使用以下代碼進(jìn)行數(shù)據(jù)批量插入:
List students = new List();
for(int i = 0; i
students.Add(new Student(){Name = “Tom”, Age = 18, Grade = 3});
}
connection.InsertAll(students);
事務(wù)處理是一種保證數(shù)據(jù)完整性和一致性的方法,可以在一組操作中,將若干操作作為一個(gè)整體進(jìn)行處理,從而使得數(shù)據(jù)的一致性得到保證。例如,使用Sqlite-net庫(kù)時(shí)可以使用以下代碼進(jìn)行數(shù)據(jù)事務(wù)處理:
using(var transaction = connection.BeginTransaction()) {
try {
connection.Insert(new Student(){Name = “Tom”, Age = 18, Grade = 3});
connection.Insert(new Student(){Name = “Lucy”, Age = 17, Grade = 2});
transaction.Commit();
} catch(Exception ex) {
transaction.Rollback();
Debug.Log(ex.Message);
}
}
通過(guò)以上三種優(yōu)化方式,可以顯著提高程序的效率和響應(yīng)速度,增強(qiáng)游戲的體驗(yàn)和穩(wěn)定性。
相關(guān)問(wèn)題拓展閱讀:
- 入門(mén)必看:Unity資源加載及管理
- UNITY3D怎樣導(dǎo)入3D模型?是網(wǎng)上下載的UNITY3D的人物和地形…..求助,新人……
入門(mén)必看:Unity資源加載及管理
Unity的資源加載及管理,基礎(chǔ)很重要。此篇文章作為近期梳理項(xiàng)目?jī)?nèi)資源管理器的一個(gè)小總結(jié),嘗試盡量用人話將Unity對(duì)資源管理的關(guān)鍵點(diǎn)梳理清楚,個(gè)人覺(jué)得比較適合像我這樣剛?cè)腴T(mén)且對(duì)AssetBundle還不甚了解的家伙。
我理解的資源管理
舉一個(gè)不恰當(dāng)?shù)睦觼?lái)描述我所理解的資源管理(因?yàn)槲覍?shí)在想不出更合適的例子了),想象一個(gè)畫(huà)面:一個(gè)表演者,站在一個(gè)臺(tái)子后面,面向觀眾,按照規(guī)定的劇本,操作著臺(tái)子后面不被觀眾看到的箱子,從里面不斷的取出和放回各種新鮮的玩意兒,一會(huì)這么組液宏合,一會(huì)那么拆散,博觀眾的眼球,最終完成表演。
我沒(méi)有當(dāng)表演者的經(jīng)歷,雖然我很想嘗試,但想想也覺(jué)得這肯定不容易:
1、如果箱子里的東西都太大,拿起來(lái)會(huì)很費(fèi)勁。
2、如果太小呢?恐怕會(huì)拿很多次。
3、不用的道具不收?放在臺(tái)子上會(huì)影響接下來(lái)的表演。
4、用過(guò)的道具收了吧。萬(wàn)一收了后面需要的道具,一會(huì)兒用的時(shí)候還要再費(fèi)勁拿一次,不拿的話吧還容易導(dǎo)致表演失敗。
帶著問(wèn)題看文章
是選擇合適的時(shí)間取出資源,并在合適的時(shí)候釋放它們,盡可能保持較低的內(nèi)存占用;還是選擇讓資源常駐內(nèi)存,換取更快的讀取和計(jì)算速度?如何在時(shí)間和空間上做出平衡,才能更大的提升游戲體驗(yàn)?我以為這些就是資源管理的目標(biāo)和意義??上н@并非易事。這不僅需要結(jié)合項(xiàng)目的實(shí)際情況,更需要豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。
但是在這里,你將不會(huì)看到任何可以參考的經(jīng)驗(yàn)或建議,因?yàn)槲乙膊恢腊 ?/p>
無(wú)論你是否單身,在Unity的世界里,你都不愁找不到對(duì)象,因?yàn)橐磺卸际菍?duì)象。
無(wú)論是紋理、音樂(lè)還是預(yù)制體,在進(jìn)入U(xiǎn)nity的世界后,都變成了各種對(duì)象供我們使用,例如紋理轉(zhuǎn)變?yōu)門(mén)exture2D或Sprite,音效文件轉(zhuǎn)變?yōu)锳udioClip,預(yù)制體變成了GameObject等等。這個(gè)由Asset(資源文件)轉(zhuǎn)變?yōu)镺bject(對(duì)象),從磁盤(pán)進(jìn)入內(nèi)存的過(guò)程,就是實(shí)例化。而對(duì)資源進(jìn)行的管理,本質(zhì)上是對(duì)Object的管理。
“小當(dāng)家,這個(gè)黃金炒飯是怎么加載出來(lái)的?”
簡(jiǎn)單介紹一下Unity加載資源的流程
在介紹Unity的資源加載機(jī)制之前,先舉一個(gè)生活中的例子,來(lái)輔助我們了解Unity是如何工作的。
因?yàn)槲覐男釔?ài)歐洲文學(xué),所以在這就拿我最喜歡的《三國(guó)演義》做例子,我們都知道書(shū)中多次提到 “集齊七顆龍珠,就可以召喚神龍,并幫你實(shí)現(xiàn)一個(gè)愿望” 這種說(shuō)法。
咸魚(yú)都有夢(mèng)想,何況一個(gè)上了歲數(shù)的程序員呢?但是很可惜,我們一顆龍珠都沒(méi)有,為了湊齊這七顆龍珠,我們首先要知道它們分別在哪。一摸左兜,哎?發(fā)現(xiàn)了一本《召喚神龍的小訣竅》,里面記錄了召喚神龍所必須七顆龍珠的 所在位置、大小、顏色以及如何使用鬧液冊(cè)等非常關(guān)鍵的信息 。
根據(jù)《召喚神龍的小訣竅》指引,我們知埋頌道原來(lái)之一顆龍珠藏在了素有小巴黎之稱的北京通縣,可是通縣在哪兒呢?一摸右兜,原來(lái)這還有一本1986年出版的《中國(guó)地圖》。那就放心了,出發(fā)吧!
終于,歷經(jīng)了81難,我們來(lái)到了目的地并最終找到了這顆龍珠。費(fèi)這么大勁找到的龍珠,當(dāng)然應(yīng)該認(rèn)真記錄下來(lái),于是我們馬上掏出一個(gè)黑皮小本本,認(rèn)真的記下: “之一顆龍珠放在背后小書(shū)包的左邊縫有一個(gè)機(jī)器貓的側(cè)兜里…” 。
…
最終,經(jīng)歷了無(wú)數(shù)艱難險(xiǎn)阻,我們湊齊了七顆龍珠(所以說(shuō)人只要肯努力,老天就一定回饋你,至少讓你知道你浪費(fèi)了時(shí)間?。?。金光一閃,我們召喚出了神龍… 后面實(shí)現(xiàn)了什么愿望我們不談,因?yàn)檎l(shuí)沒(méi)有點(diǎn)小秘密呢。
現(xiàn)在,讓我們來(lái)回顧一下整個(gè)過(guò)程
1、這條召喚出來(lái)的神龍,就好比我們想要實(shí)例化的對(duì)象,就比如游戲?qū)ο蟀?,因?yàn)樗鄬?duì)復(fù)雜些。而這七顆龍珠呢,就好似組成這個(gè)游戲?qū)ο笏仨毜母鞣N組件(Component)、紋理(Texture)、網(wǎng)格(Mesh)等等。
2、《召喚神龍的小訣竅》就好比我們讀取的這個(gè).prefab文件,它記錄了組成這個(gè)GameObject所必須的其他對(duì)象以及它們的位置。
重點(diǎn)來(lái)了:File GUID 及 Local ID。
File GUID
Unity會(huì)為每一個(gè)加入到Assets文件夾中的文件,創(chuàng)建一個(gè)同級(jí)同名的.meta文件,雖然文件類型的不同會(huì)影響這個(gè).meta的具體內(nèi)容,但它們都包含一個(gè)用來(lái)標(biāo)記文件身份的File GUID。
例如,如果一個(gè)資源引用了另一個(gè)外部資源,比如一個(gè)Prefab引用了其他腳本、紋理或Prefab等,則一定會(huì)標(biāo)明引用資源文件的File GUID。
Local ID
如果說(shuō)File GUID表示為文件和文件之間的關(guān)系,那么Local ID表示的就是文件內(nèi)部各對(duì)象之間的關(guān)系,打開(kāi)一個(gè)*.Prefab文件可以很清晰的看到:
(點(diǎn)擊上圖,可放大查看)
一個(gè)對(duì)象通常是由 一個(gè)或多個(gè) 對(duì)象構(gòu)成,每個(gè)記錄在&符號(hào)后面的數(shù)字都是一個(gè)Local ID,每一個(gè)Local ID也表示這它將來(lái)也會(huì)被實(shí)例化成一個(gè)對(duì)象。也就是說(shuō),當(dāng)一個(gè)prefab文件要實(shí)例化成一個(gè)GameObject時(shí),它會(huì)自動(dòng)嘗試獲取其內(nèi)部Local ID所指的那個(gè)對(duì)象。如果這個(gè)所指的對(duì)象當(dāng)前還沒(méi)有被實(shí)例化出來(lái),那么Unity會(huì)自動(dòng)實(shí)例化這個(gè)對(duì)象,如此遞歸,直到所有涉及的對(duì)象都被實(shí)例化。
3、我們可以發(fā)現(xiàn)手中沒(méi)有龍珠,是因?yàn)槲覀兪种械暮谏”颈?,并沒(méi)有記錄龍珠裝在書(shū)包的那個(gè)位置里;同樣,Unity通過(guò) Instance ID ,來(lái)獲取或判斷一個(gè)對(duì)象是否已經(jīng)被加載完畢。 Instance ID由File GUID和Local ID轉(zhuǎn)換而成,可以簡(jiǎn)單理解成是記錄了資源所在內(nèi)存地址的寫(xiě)著數(shù)字的鑰匙牌。
每當(dāng)Unity讀入一個(gè)File GUID和LocalID時(shí),就會(huì)自動(dòng)將其轉(zhuǎn)換成一個(gè)簡(jiǎn)單好記的數(shù)字牌,因?yàn)橥ㄟ^(guò)File GUID和Local ID定位資源的效率并沒(méi)有直接解引用一個(gè)地址那么快。
如果發(fā)現(xiàn)這個(gè)牌上并沒(méi)有掛著一把鑰匙,表示當(dāng)前這個(gè)這個(gè)資源還在磁盤(pán)中,尚不在內(nèi)存里(沒(méi)有加載);相反,如果這個(gè)牌子上有一把鑰匙,表示這個(gè)資源已經(jīng)被加載完畢,你可以快速的找到并使用它。
Unity會(huì)在項(xiàng)目啟動(dòng)后,創(chuàng)建并一直維護(hù)一張“映射表”,這張映射表記錄的就是File GUID、Local ID以及由它們轉(zhuǎn)換而成的Instance ID之間的關(guān)系,這樣下次在請(qǐng)求資源時(shí)就可以快速的通過(guò)查看鑰匙牌來(lái)獲取資源了。
4、剛才的例子里,因?yàn)闆](méi)有龍珠(資源沒(méi)有加載),因此我們必須經(jīng)歷一場(chǎng)前往小巴黎的歷險(xiǎn)(LoadingAsset),而能夠幫助我們準(zhǔn)確定位北京通縣的86版《中國(guó)地圖》,可以近似理解成是 Unity維護(hù)的一套將GUID和FileID解析為數(shù)據(jù)源地址的機(jī)制, 這套機(jī)制中的信息,來(lái)自于:
(1) 場(chǎng)景加載時(shí),Unity收集了與該場(chǎng)景關(guān)聯(lián)的資源信息。
(2) 項(xiàng)目啟動(dòng)時(shí),Unity收集了所有Resources文件夾下的資源信息。
(3) 讀取AssetBundle時(shí),Unity獲取了AssetBundle文件的頭部信息(Header)。
可以理解為:隨著Unity知道更多的信息,這套機(jī)制將能夠解析并定位更多的GUID和FileID。
5、當(dāng)我們費(fèi)勁千辛萬(wàn)苦找到龍珠后,記錄在小本本上的7條位置,就好比7個(gè)能幫助夠準(zhǔn)確定位內(nèi)存位置的Instance ID。想象一下,當(dāng)我們下次再看到諸如《三顆龍珠召喚小神龍》這樣的小訣竅( 另外一個(gè)*.prefab ),便可直接打開(kāi)小本本( 查詢映射表中的Instance ID ),對(duì)著編號(hào)及位置從書(shū)包里掏出龍珠( 對(duì)InstanceID所指的內(nèi)存地址進(jìn)行解引用 ),啪啪啪一操作,小神龍這個(gè)游戲?qū)ο缶湍芎芸毂徽賳境鰜?lái)了,再也不用去什么通縣了,可以節(jié)省大把時(shí)間,想想就覺(jué)的美滋滋呢。
AssetBundle
AssetBundle(阿賽特邦豆)是Unity官方推薦的資源加載方式,網(wǎng)上對(duì)AssetBundle的介紹有很多,且在了解了Unity對(duì)資源的加載機(jī)制后,其本身沒(méi)有什么特別難以理解的地方了,因此在這不過(guò)多介紹,僅挑選幾個(gè)關(guān)鍵點(diǎn)進(jìn)行闡述。
AssetBundle的生成
生成AssetBundle有很多種方式,在此僅簡(jiǎn)單說(shuō)一下比較常用的方式,使用BuildPipeline生成AssetBundle文件。
每一次調(diào)用BuildPipleLine.BuildAssetBundles時(shí),將會(huì)生成一批AssetBundle文件,具體數(shù)量根據(jù)傳遞AssetBundleBuild數(shù)組決定, 每一個(gè)AssetBundleBuild對(duì)象將對(duì)應(yīng)一個(gè)AssetBundle及一個(gè)同名+.manifest后綴文件 。其中AssetBundle文件的后綴用戶自行設(shè)置,比如”.unity3d”,”.ab”等等;而.manifest文件是給人看的,里面有這個(gè)AssetBundle的基本信息以及非常關(guān)鍵的資源列表。
除了AssetBundleBuild數(shù)組所定的AssetBundle外,還將額外在output路徑下生成的一對(duì)與output文件夾同名的文件及一個(gè)同名.manifest后綴文件。這個(gè)同名文件可厲害了,它記錄了這批次AssetBundle之間的相互依賴關(guān)系。當(dāng)然.manifest文件還是給人看的,我們可以用它分析資源間的依賴關(guān)系,但是在項(xiàng)目實(shí)際運(yùn)行時(shí),Unity并不會(huì)關(guān)心它。
(點(diǎn)擊上圖,可放大查看)
可以通過(guò)這張圖來(lái)看一下每次Build后資源的對(duì)應(yīng)關(guān)系,當(dāng)然這都不如你自己親自Build一次看的清楚。
AssetBundle的加載
根據(jù)AssetBundle文件所在的位置(本地、遠(yuǎn)端),AssetBundle有不同的加載方式,在此僅總結(jié)最常用的本地AssetBundle文件加載。
我個(gè)人將AssetBundle拆分理解為: Bundle加載 和 Asset加載 兩部分。因?yàn)锳ssetBundle文件可以從功能上分為兩大塊:
1、記錄文件標(biāo)記、壓縮信息、文件列表的Header部分;
2、記錄資源實(shí)際內(nèi)容的Data部分。
當(dāng)使用AssetBundle.LoadFromFile或LoadFromFileAsync時(shí),在pc平臺(tái)及移動(dòng)平臺(tái)上,unity 僅會(huì)為我們讀取AssetBundle的header部分,并不會(huì)將bundle的data部分整個(gè)讀入內(nèi)存。
當(dāng)調(diào)用上一步生成的AssetBundle對(duì)象讀取具體資源時(shí)(LoadAsset, LoadAssetAsync, LoadAllAssets),Unity會(huì)參考已經(jīng)緩存的文件列表,找到目標(biāo)資源在data部分的位置并讀入到內(nèi)存中。
如果一個(gè)資源引用到了其他資源,則必須要先讀入被引用資源的AssetBundle文件,否則就會(huì)發(fā)生引用Miss。 這就好似召喚神龍時(shí),通過(guò)《召喚神龍的小訣竅》得知之一顆龍珠在北京通縣,但是當(dāng)打開(kāi)《中國(guó)地圖》時(shí),北京的地方被摳了一個(gè)窟窿,我去,這樣我們就無(wú)法通過(guò)它準(zhǔn)確定位龍珠位置了,只有六顆龍珠召喚出的神龍,當(dāng)然有一部分是Miss嘍。
為了避免上面Miss的情況,在加載資源時(shí), 首先需要將該資源的依賴項(xiàng)全部加載完畢,不過(guò)僅需加載依賴資源的AssetBundle文件。 也就是說(shuō),我們只要將該依賴AssetBundle的Header部分加載(AssetBundle.LoadFromFile或LoadFromFileAsync)就可以,這樣在真正讀取Asset時(shí),Unity會(huì)自動(dòng)處理好真實(shí)依賴的Asset,我們不用操心。
AssetBundle的依賴關(guān)系如何讀取呢?加載上面提到的那個(gè)很厲害的文件就可以了。
(點(diǎn)擊上圖,可放大查看)
非常簡(jiǎn)單的獲取依賴關(guān)系的方法,通常會(huì)在項(xiàng)目啟動(dòng)時(shí)將全部依賴關(guān)系保存下來(lái)。
AssetBundle的使用
當(dāng)AssetBundle被成功加載后,調(diào)用該Assebbundle對(duì)象的LoadAsset、LoadAllAssets或?qū)?yīng)的異步版本即可加載資源,也就是實(shí)例化對(duì)象。如果這個(gè)對(duì)象已經(jīng)被加載過(guò),Unity并不會(huì)重復(fù)加載,還記得之前所說(shuō)的映射表么,被加載過(guò)的資源就好比掛上了數(shù)字牌的鑰匙,直接對(duì)地址解引用即可。
AssetBundle的卸載
如果說(shuō)AssetBundle真的有什么容易出問(wèn)題的地方,那恐怕就是卸載了。
在這里只說(shuō)最常用的這個(gè)卸載方法吧:
public void Unload(bool unloadAllLoadedObjects);
一個(gè)被加載過(guò)的AssetBundle可以通過(guò)調(diào)用Unload來(lái)卸載這個(gè)Bundle下所有的Asset。但是調(diào)用這個(gè)函數(shù)時(shí)傳入的參數(shù) 對(duì)卸載結(jié)果影響甚大。
Unity官方對(duì)這個(gè)函數(shù)的講解非常詳細(xì),配圖也非常直觀,因此我只是簡(jiǎn)單總結(jié)一下。
相同點(diǎn):
無(wú)論傳入?yún)?shù)為 true 或是 false,調(diào)用Unload都可以Destroy當(dāng)前AssetBundle對(duì)象,釋放之前從AssetBundle文件中的Header部分所獲取的信息。當(dāng)然,被釋放的AssetBundle對(duì)象無(wú)法再使用諸如LoadAsset、LoadAllAssets等函數(shù)加載資源。
不同點(diǎn):
unloadAllLoadedObjects == true:
不僅Destroy了AssetBundle這個(gè)對(duì)象,而且 這個(gè)AssetBundle下包含的所有對(duì)象,只要實(shí)例化了,有一個(gè)算一個(gè),統(tǒng)統(tǒng)釋放掉。
感覺(jué)就像
foreach(Object asset in assets)
{
if(asset != null)
{
delete asset;
asset = null;
}
}
比如你通過(guò)ab.LoadAsset(apple)后,將apple設(shè)置給go_0的一個(gè)Renderer,如果這時(shí)候ab.Unload(true),那go_0就傻了,咋回事兒啊,圖咋沒(méi)了呢?WTF啊。
它的好處是: 不會(huì)有重復(fù)資源問(wèn)題的情況發(fā)生,每次都處理的干干凈凈。
unloadAllLoadedObjects == false:
僅僅Destroy了AssetBundle這個(gè)對(duì)象,但是并沒(méi)有釋放這個(gè)AssetBundle下的任何Asset,因此如果有對(duì)象引用了這些Asset,也不會(huì)有問(wèn)題。
它的風(fēng)險(xiǎn)(代價(jià))是:下次再Load這個(gè)AssetBundle,并且通過(guò)這個(gè)AssetBundle重新讀取了這個(gè)Asset,會(huì)在內(nèi)存中重新創(chuàng)建一份,這樣如果之前的Asset沒(méi)有被釋放,那么現(xiàn)在內(nèi)存中就有兩份Asset了。
這種情況如果頻繁發(fā)生,便意味著內(nèi)存中有很多資源將“不受控制”,容易引發(fā)內(nèi)存占用過(guò)高的問(wèn)題,而釋放這種不受控的資源,僅有兩種方式:
1、當(dāng)沒(méi)有對(duì)象引用到這些不受控資源時(shí),每次調(diào)用Resources.UnloadUnusedAssets,回收之。
2、加載場(chǎng)景時(shí),如果加載模式?jīng)]有設(shè)置為L(zhǎng)oadSceneMode.Additive,則會(huì)自動(dòng)調(diào)用Resources.UnloadUnusedAssets。
同樣,再舉一個(gè)生活中的小例子以闡述這兩種釋放的差異吧:
小A交女朋友時(shí)喜歡送心形的石頭給對(duì)方,這天小A認(rèn)識(shí)了一個(gè)女孩,并確定了關(guān)系,送了一個(gè)精心挑選的心形石頭給她,海誓山盟又云雨一番后,第二天由于感情不和等原因兩人分手了。小A是個(gè)暖男,他為了女孩能徹底忘記優(yōu)秀的自己并開(kāi)始一段新的感情,約見(jiàn)了女孩,將之前送給女孩的石頭拿(搬)走了,從此注銷了微信消失在茫茫人海中。
確實(shí),小A喜歡強(qiáng)壯的女孩,因?yàn)檫@樣比較有安全感。
小B交女朋友時(shí)也喜歡送石頭給對(duì)方,周一小B認(rèn)識(shí)了一個(gè)女孩,并確定了關(guān)系,送了一個(gè)精心挑選的石頭給她,海誓山盟又云雨一番后,第二天由于感情不和等原因兩人分手了。但是小B家里是開(kāi)石材加工場(chǎng)的,他并不關(guān)心這塊石頭,”送了就送了吧,至少我經(jīng)歷了浪漫的愛(ài)情“,小B這么想。并注銷了微信消失在茫茫人海中…達(dá)1天之久。
周二的時(shí)候小B重出江湖,并認(rèn)識(shí)了一個(gè)新的女孩,確定了關(guān)系,第三天…第四天..啪啪啪…第七天,第二周的時(shí)候,江湖上就出現(xiàn)了一個(gè)傳說(shuō),集齊小B湊齊的七顆石頭,便可以召喚神龍,于是就回到了文章開(kāi)頭我們提到的那個(gè)故事。
沒(méi)錯(cuò),小A對(duì)應(yīng)的就是Unload(true),而小B對(duì)應(yīng)的則是Unload(false)。
補(bǔ)充三點(diǎn)
1、移動(dòng)Unity資源時(shí),要在Unity編輯器內(nèi)拖動(dòng),不要在操作系統(tǒng)下剪切粘貼。因?yàn)檫@樣Unity會(huì)為這個(gè)文件生成一個(gè)新的File GUID及.meta文件,它會(huì)打破之前建立好的關(guān)系,讓所有引用過(guò)這個(gè)文件的prefab出現(xiàn)miss的情況。
2、實(shí)際上在項(xiàng)目build完成后,就已經(jīng)不存在File GUID和Local ID的概念了,轉(zhuǎn)而用相對(duì)簡(jiǎn)單方式建立映射,這也是為什么我們?cè)陧?xiàng)目運(yùn)行的過(guò)程中無(wú)法獲取到File GUID的原因,不過(guò)原理上它們是一樣的。
3、盡管一個(gè)AssetBundle的Header部分非常小,通常只有幾十KB,但是Unity并不能保證讀入大量AssetBundle的Header部分后資源的加載效率。因此還是按需讀取AssetBundle吧。
UNITY3D怎樣導(dǎo)入3D模型?是網(wǎng)上下載的UNITY3D的人物和地形…..求助,新人……
請(qǐng)問(wèn)是fbx還是obj還是mb模型?
可以導(dǎo)入3dsMAX、MAYA所導(dǎo)出的.max,.mb,fbx等等,在asset中右鍵import就可以模明激槐世。網(wǎng)上都可以下載到.max和.mb的模型,旦襪人物地形都有。
Unity中只粗搏能使用螞凳絕fbx 或者obj格式 你要在max或者maya里面轉(zhuǎn)換成悶姿這種格式 然后直接把轉(zhuǎn)換好的資源 拖進(jìn)unity的 assets中即可
去游蠻牛上學(xué)習(xí)學(xué)習(xí)吧
unity運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于unity運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù),Unity中的運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù)處理技巧,入門(mén)必看:Unity資源加載及管理,UNITY3D怎樣導(dǎo)入3D模型?是網(wǎng)上下載的UNITY3D的人物和地形…..求助,新人……的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁(yè)名稱:Unity中的運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù)處理技巧(unity運(yùn)行時(shí)存儲(chǔ)模型數(shù)據(jù)庫(kù))
網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/dhdjjid.html


咨詢
建站咨詢
