最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一小時(shí)極速掌握游戲資源遠(yuǎn)程熱更新

2021-05-17 13:09 作者:獨(dú)立游戲人-老雷  | 我要投稿

版權(quán)聲明

  • 本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明

  • 更多學(xué)習(xí)資源請(qǐng)加QQ:1517069595獲?。ㄆ髽I(yè)級(jí)性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對(duì)一指導(dǎo))

  • 今天這篇文章一共分為兩個(gè)部分,第一部分為游戲的遠(yuǎn)程熱更新,第二部分為實(shí)現(xiàn)一個(gè)商業(yè)項(xiàng)目的資源熱更新。

二、三十分鐘實(shí)現(xiàn)資源/代碼遠(yuǎn)程熱更新


  • 首先我們作一個(gè)約定,第一點(diǎn)我們會(huì)使用unity最新的一套資源管理的解決方案,叫做AddressableAssets。AddressableAssets是unity官方現(xiàn)在主推的一個(gè)資源管理的插件包,它的目的就是用來取代unity傳統(tǒng)的AssestBundle簡稱AB包的資源管理方式。

  • 使用Addressable這個(gè)插件有什么好處呢?

  • 大家知道我們?cè)谶^去使用AssestBundle進(jìn)行資源管理的時(shí)候,他的痛點(diǎn)很多。第一個(gè)是這個(gè)資源管理它采用一種叫做地址引用的方式。

    1. 第一點(diǎn)好處,解決了資源的重復(fù)引用問題。原來大家如果有過AssestBundle編程經(jīng)驗(yàn),大家就知道原來去用AssestBundle去管理一個(gè)資源。比如說有一個(gè)資源A,他引用了一個(gè)資源B,還引用了一個(gè)資源C的話。這個(gè)時(shí)候我要自己處理資源。在A進(jìn)行加載之前,必須要把B和C給它加載進(jìn)來。而如果我們使用Addressable這樣一個(gè)插件,我們就不需要管理這些復(fù)雜性。他的地址的引用是很簡單的,我只要指定我要加載的資源名A,然后他自動(dòng)去把B和C給它加載進(jìn)來。這個(gè)是我們使用Addressable的第一個(gè)好處.

    2. 第二點(diǎn)好處,自動(dòng)資源引用計(jì)數(shù)機(jī)制。比如說我舉個(gè)例子,還有一個(gè)好處就是資源的卸載,過去我們?cè)谑褂肁ssestBundle進(jìn)行資源管理的時(shí)候,資源卸載也是一個(gè)耗時(shí)耗力的過程。因?yàn)樗械馁Y源卸載都需要你自己去負(fù)責(zé)。而現(xiàn)在我們使用AssestBundle,它自動(dòng)在我們資源引用計(jì)數(shù)為零的時(shí)候,就自動(dòng)把資源卸載掉。

    3. 第三點(diǎn)好處,完善的工具界面。大家使過過AssestBundle的同學(xué)都知道,我們使用AssestBundle的資源管理界面是需要自己去搭的。比如說我要管理某一個(gè)文件夾里面的資源,打包成一個(gè)資源包。如果我想通過可視化的方式去指定哪個(gè)文件夾打到哪個(gè)資源包。我要么編寫代碼沒有界面,要么必須要找一些第三方的插件,要么必須自己寫一個(gè)類似的編輯器擴(kuò)展。它對(duì)我們開發(fā)者的要求還是比較高的,而使用我們的Addressable,它會(huì)有一個(gè)整合好的資源管理界面。

    4. 第四點(diǎn)好處,是能夠支持遠(yuǎn)程資源加載和熱更新。原來做遠(yuǎn)程資源的熱更新,需要自己去管理,如何從網(wǎng)絡(luò)上下載資源。如何去打補(bǔ)丁。如何把補(bǔ)丁傳到服務(wù)器。如何去進(jìn)行版本比對(duì)。如何去下載這個(gè)熱更新的資源,而如果我們使用了Addressable這樣一個(gè)插件以后。這些都可以由我們的Addressable自動(dòng)去管理。


  • 講了Addressable的好處之后,我給大家講一下Addressable的工作流程和實(shí)現(xiàn)方法。

  • Addressable他的使用流程包括四個(gè)點(diǎn)。

    1. 首先第一步,我們需要?jiǎng)?chuàng)建一個(gè)資源分組。這個(gè)資源分組他就對(duì)應(yīng)了過去你用AsssetBundle打出來的一個(gè)資源包,如果你沒有學(xué)過AssestBundle也沒有關(guān)系。你可以把它理解成一個(gè)資源組,默認(rèn)的它會(huì)打出來一個(gè)資源文件。

    2. 第二步,我們通常是會(huì)把我們需要在項(xiàng)目當(dāng)中使用的資源,加入到我們的資源組里面。

    3. 第三步,我們通常會(huì)把這些資源進(jìn)行一個(gè)打包。打包以后呢,就會(huì)按照一個(gè)資源組一個(gè)資源包,一個(gè)資源組一個(gè)資源包的方式,那么形成最終我們可以在游戲項(xiàng)目當(dāng)中所使用所更新的這些資源包。

    4. 第四步,在我們打包完以后,就要去加載這些資源。unity支持資源的本地打包和本地加載。也就是說直接從你的安裝包里面去加載,他也支持不打到你的安裝包里面,而是從遠(yuǎn)程服務(wù)器來進(jìn)行資源加載。

  • Addressable的操作實(shí)現(xiàn)

    • 首先第一步我們需要?jiǎng)?chuàng)建一個(gè)unity項(xiàng)目。我們?cè)谡业紸ddressable插件,然后點(diǎn)一個(gè)安裝,就能安裝Addressable這樣一個(gè)資源管理組件。

  • 那么這個(gè)插件怎么用呢?我怎么去打包一個(gè)資源呢。首先我需要?jiǎng)?chuàng)建一些資源,比如我創(chuàng)建兩個(gè)小球,一個(gè)叫做Local,一個(gè)叫做Remote,并設(shè)置不同的顏色。如圖:

  • 接著我們需要?jiǎng)?chuàng)建資源組,把我們剛剛創(chuàng)建的兩個(gè)小球添加到資源組里面

  • 可以看到這兒有一個(gè)com.unity.Addressable,打開以后,可以看到在這兒有一個(gè)文件夾,這個(gè)文件夾就是我們的BuildPath。關(guān)于文件位置可以參考官方文檔。

  • 我們的資源打包在Windows64位這個(gè)文件夾下面

  • 里面會(huì)有三個(gè)資源目錄。

  • 第一個(gè)資源目錄叫做local-assest-all大家注意這個(gè)名字,通過這個(gè)名字我們就知道它對(duì)應(yīng)的實(shí)際上就是我們的本地的資源組。然后這個(gè)后綴都是Addressable在打包的時(shí)候它自動(dòng)加的。

  • 第二個(gè)local開頭的,還是本地的文件。這個(gè)是unity在啟動(dòng)程序的時(shí)候,會(huì)把一些默認(rèn)的比如說在渲染這個(gè)小球的時(shí)候,他會(huì)用一個(gè)默認(rèn)的Shader來進(jìn)行渲染,這個(gè)渲染用的Shader也必須打包。如果不打包的話,將來就沒有辦法去使用這些Shader。

  • 關(guān)于這個(gè)內(nèi)置系列的知識(shí),大家可以參考我們的unity小白的TA之路。接著就是一個(gè)我們打包的一個(gè)遠(yuǎn)程目錄,就是我們這個(gè)remote開頭的。后面這些是這個(gè)文件的校驗(yàn)碼,關(guān)于這些詳細(xì)的細(xì)節(jié)知識(shí),這個(gè)校驗(yàn)碼是怎么生成的。那么這個(gè)呢大家可以參考這個(gè)Addressable的源碼。

  • 我們開始寫腳本。由于我們使用的是AA熱更新,我就不用以前的GameObject預(yù)制體了,新創(chuàng)建一個(gè)AssestReference預(yù)制體,用異步的方法創(chuàng)建我們的預(yù)制體,其中Random.insideUnitSphere表示在固定的范圍內(nèi)創(chuàng)建預(yù)制體。這里一些關(guān)于Unity的基礎(chǔ)知識(shí)可以觀看我們的小白游戲夢公開課。

  • 接著我們將腳本掛載到場景中,并且指定要生成的預(yù)制體,接著點(diǎn)擊生成按鈕,就可以得到下圖的效果。

  • 但是在一個(gè)實(shí)際的大型商業(yè)項(xiàng)目當(dāng)中,我們?nèi)绻诩虞d資源的時(shí)候,都是從這兒去選擇資源進(jìn)行加載,這個(gè)時(shí)候我們的效率是非常低的。大家想象一下,如果我們的本地資源組里面不是一個(gè)資源而是100個(gè)資源,那么如果我需要指定加載什么資源,那么我是不是得要從本地資源組把這個(gè)資源拖一遍一遍。如果你要加載100個(gè)資源你就拖100次。如果你要對(duì)這個(gè)100個(gè)資源做任何的修改,你可能要重新再拖100次。這樣效率就太低下了,所以說怎么辦呢,我們還有第二個(gè)辦法,就是不要用拖的辦法,就是不要用這個(gè)AssestReference,而是通過資源的名字來進(jìn)行實(shí)例化。

  • 接著我們要從遠(yuǎn)程加載我們的資源,先將我們的小球build一下,可以看到他打包的文件所在。

  • 我們的加載方式一共有三種。

    如果你使用第一種方式,它直接就是從項(xiàng)目資源里面去加載。

    第二種方式叫做模擬加載。

    第三種方式是使用打包的資源組加載。所以說不管你要測試本地加載還是遠(yuǎn)程加載,我們都應(yīng)該使用第三項(xiàng)。

    那么在你正式上線的時(shí)候,你一定是使用第三項(xiàng)。那么我們?nèi)绻麨榱碎_發(fā)方便我們通常會(huì)選擇第一項(xiàng)或者第二項(xiàng)。但是第一項(xiàng)會(huì)有一些問題,所以說我們更多的是,包括在我們的皇室戰(zhàn)爭這個(gè)大型商業(yè)項(xiàng)目課程里面,我們都會(huì)使用第二項(xiàng)。這兩項(xiàng)有什么區(qū)別呢,在我們的Addressable源碼解析的視頻里面我們會(huì)給大家做詳細(xì)的解釋。

  • 這里我們需要用到一個(gè)HFS的小工具來找到我們的資源服務(wù)器,在打開這個(gè)小工具之后,就把遠(yuǎn)程的路徑添加到我們的網(wǎng)頁服務(wù)器上面。

    這個(gè)工具可以添加我們的老師QQ:1517069595領(lǐng)取

  • 我們將小球改成黃色,并且把打包路徑中的選項(xiàng)選擇為遠(yuǎn)程,加載遠(yuǎn)程資源,如圖,注意我們?cè)诘谝淮未虬t色小球時(shí),就應(yīng)當(dāng)將他設(shè)置成遠(yuǎn)程。

  • 但是只有當(dāng)我們使用它的時(shí)候才被加載出來,這叫做邊下邊玩的模式。我用到什么資源他才去下載。但是實(shí)際上這種方式并不太符合我們國內(nèi)游戲廠商的一種資源熱更新的方式。所以在我們的系統(tǒng)課程里面,我們會(huì)去教大家如何像國內(nèi)游戲一樣,在啟動(dòng)的時(shí)候先彈一個(gè)公告。如果有資源更新,彈一個(gè)資源更新的請(qǐng)求框,如果你點(diǎn)了確認(rèn)以后一次性的把游戲需要更新的資源更新下來。而不是說我一邊玩,然后我這邊要用到某一個(gè)資源來從服務(wù)器下載。這樣的話會(huì)造成一個(gè)問題。就是如果你一邊下一邊玩,比如說你在戰(zhàn)斗的時(shí)候,他在那兒去下載資源,這個(gè)時(shí)候游戲的體驗(yàn)也很不好,所以說國內(nèi)的游戲很多都不是邊下邊玩。

三、商業(yè)項(xiàng)目中的資源熱更新進(jìn)階

  • 第一部分,資源卸載

  • 我們知道了這個(gè)Addressable會(huì)根據(jù)配置好的路徑去加載資源。一種是本地路徑,一種是遠(yuǎn)程路徑,我們用InstatiateAsync這個(gè)函數(shù)。那么我們?nèi)绾稳メ尫乓粋€(gè)對(duì)象呢?就是如果你想要去釋放你這個(gè)實(shí)例化的對(duì)象,那么我們只需要用ReleseInstance就可以了。

  • 這個(gè)是對(duì)于游戲?qū)ο蠖?,或者說是對(duì)于一些場景當(dāng)中的預(yù)制體。我要實(shí)例化它,然后去釋放他。那么我就用InstantiateAsync實(shí)例化,用Release來釋放。

  • 如果是一些圖片資源,一些動(dòng)畫資源,模型資源,那么我們就不能實(shí)例化,因?yàn)樗皇菆鼍皩?duì)象。那么我們就可以用LoadAssestAsync來去進(jìn)行加載,然后用Release來進(jìn)行釋放。

  • 另外關(guān)于Async也就是異步,在外面的系統(tǒng)課程里面會(huì)詳細(xì)給大家講。這里就給大家簡單講一下。

  • 下面的程序,就是設(shè)置了一個(gè)異步,當(dāng)程序運(yùn)行到這里時(shí),會(huì)把控制權(quán)暫時(shí)交給Unity引擎,Unity引擎會(huì)進(jìn)行一些處理,我們的程序不會(huì)卡死在這里,會(huì)繼續(xù)執(zhí)行。

  • 第一點(diǎn)還有第二小點(diǎn),就是我們?cè)趫鼍袄锩婵梢詣?chuàng)建很多的游戲?qū)ο?。比如說我可以創(chuàng)建很多的弓箭手,很多的法師,很多的戰(zhàn)士。但是我們會(huì)注意到。如果你場景里面創(chuàng)建的這些戰(zhàn)士都死亡了,或者說是我這個(gè)從戰(zhàn)斗場景退出以后切換到游戲的主菜單了,那這個(gè)時(shí)候戰(zhàn)斗場景里面的對(duì)象都會(huì)消失,都會(huì)被銷毀。這些對(duì)象銷毀的時(shí)候,我們是不是應(yīng)該同步的把它們所占用的資源給卸載掉。那么我們的Addressable提供了一個(gè)叫做性能分析面板,大家可以看后面這個(gè)數(shù)字,這個(gè)數(shù)字就表示我們的比如說弓箭手他被他當(dāng)前在游戲當(dāng)中創(chuàng)建的實(shí)例的數(shù)量。

  • 第二部分是在我們的商業(yè)項(xiàng)目當(dāng)中,我們的游戲資源數(shù)量會(huì)比較多,如果通過拖拽的方式加載,顯然是不現(xiàn)實(shí)的,我們的解決方案是一個(gè)完全可視化的工作流,會(huì)基于規(guī)則來進(jìn)行大規(guī)模的資源打包。

  • 第三部分是我們深入打包以后形成的資源分析,比如我們知道每一個(gè)打包的資源會(huì)形成一個(gè)catalog文件,那么這個(gè)文件存在的意義是什么,內(nèi)部記錄了什么,在資源打包的時(shí)候,我們每一個(gè)分組打一個(gè)包,那么我們能不能不按分組打包,而是按比如標(biāo)簽打包,還有關(guān)于資源重復(fù)打包的問題。關(guān)于這些問題可以添加我們的愛麗絲老師去領(lǐng)一下我們之前關(guān)于資源管理的公開課。

  • 第四點(diǎn)就是如何檢查、修復(fù)我們?cè)谫Y源打包時(shí)遇到的問題,就比如之前講到的邊玩邊下模式的優(yōu)化。

  • 第五點(diǎn)就是代碼熱更,那么Addressable他能管理所有的資源,同樣也能管理程序資源。我們知道我們的程序資源,其實(shí)打包以后它就是會(huì)形成一個(gè)編譯好的程序集。我們要做的僅僅是更新,就是把這個(gè)程序集作為一種資源。然后在程序啟動(dòng)的時(shí)候更新DLL文件,這個(gè)程序集就可以了.

  • 那么當(dāng)然在ios平臺(tái)上面,你做的事情可能比更新程序集要復(fù)雜一點(diǎn)。在安卓平臺(tái)上,只要去更新我的程序集,然后通過反射加載這個(gè)程序就可以了。但是ios因?yàn)樗拗屏藙?dòng)態(tài)的去載入新的程序集到APP里面來進(jìn)行執(zhí)行,所以的話我們需要有一個(gè)基于lLRuntime的熱更新的方案。

  • 關(guān)于這方面的內(nèi)容呢,大家也可以參考一下我們的系統(tǒng)課程,我們的皇室戰(zhàn)爭S3是全網(wǎng)為數(shù)不多的去詳細(xì)的給大家講解一個(gè)是客戶端,一個(gè)是服務(wù)器雙端熱更的一個(gè)解決方案。

  • 第三個(gè)就是大家可以參考我們的公開課,關(guān)于熱更新的那些限制。剛才我們不是說ios平臺(tái)有限制嗎?為什么有這個(gè)限制,它的技術(shù)原理是什么樣的,為什么我們使用熱更新能進(jìn)行更新呢,那么這個(gè)都在我們的unity熱更那些事兒。這個(gè)公開課里面是免費(fèi)的,然后最后一個(gè)是我們的一小時(shí)極速掌握lLRuntime熱更新。大家也可以去了解一下這個(gè)公開課。添加我們老師的QQ:1517069595。

  • 接著我們來看第六個(gè)點(diǎn),現(xiàn)在我們進(jìn)入到Addressable時(shí)代以后,他一個(gè)先進(jìn)的地方就是它的打包流程是可以定制的。就像我們unity里面進(jìn)入到urp渲染管線這樣一個(gè)時(shí)代以后,渲染流程是可以定制一樣,我們的打包流程也是可以定制的。關(guān)于打包流程的定制,大家可以參考我們的addressable源碼解析公開課。

  • 第七個(gè)點(diǎn)是資源的卸載釋放。前面我講過了,Addressable的資源管理是基于一個(gè)叫做引用計(jì)數(shù)的機(jī)制。

  • 比如說一個(gè)游戲當(dāng)中的一個(gè)游戲單位,這個(gè)游戲單位呢他可能有很多份,比如說游戲當(dāng)中有弓箭手,你可能有很多相同的弓箭手。這個(gè)時(shí)候呢這個(gè)弓箭手資源它就會(huì)被使用很多次。當(dāng)這個(gè)資源不使用了,當(dāng)這個(gè)弓箭手資源在場景里面全部銷毀不使用的時(shí)候。那么我們說它的使用次數(shù)就變成零。Addressable它會(huì)檢測到引用次數(shù)為零,這樣的一些資源,然后做對(duì)應(yīng)的資源釋放,那么它內(nèi)部的資源釋放的原理是什么,引用技術(shù)是如何實(shí)現(xiàn)的。

  • 這個(gè)同樣是我們?cè)诠P試、面試的時(shí)候一個(gè)高頻的問題。我們也會(huì)在課程當(dāng)中去給大家做詳細(xì)的講解,那么這個(gè)也是商業(yè)游戲當(dāng)中的一個(gè)必不可少的特性。另外的話呢,我們還會(huì)講解的就是Addressable自帶的一個(gè)性能分析器。但是Addressable的性能分析呢,還是有一些限制的,那么所以說我們?nèi)绾瓮黄扑南拗疲@個(gè)也是需要進(jìn)一步學(xué)習(xí)。

  • 第八點(diǎn),那么前面我們講過,我們的項(xiàng)目啟動(dòng)以后它有三種啟動(dòng)模式。直接使用項(xiàng)目資源模式,模擬模式和真實(shí)打包模式。那么這三種模式它的底層究竟有什么區(qū)別。它是如何實(shí)現(xiàn)最快速的,高級(jí)的和真實(shí)打包的這三種模式呢,這個(gè)也會(huì)在我們的Addressable源碼解析的這個(gè)課程當(dāng)中去給大家進(jìn)行詳細(xì)的講解。

四、小結(jié)



  • 我們今天大致上給大家講了三個(gè)方面的內(nèi)容。

  • 第一個(gè)是總體流程,

  • 第二個(gè)是如何實(shí)現(xiàn)熱更新。

  • 第三個(gè)我們講了Addressable在商業(yè)項(xiàng)目當(dāng)中的八大特性。這個(gè)商業(yè)項(xiàng)目當(dāng)中必須要掌握的點(diǎn)。那么同時(shí)也是你在筆試面試環(huán)節(jié)必須要掌握的一些關(guān)于資源管理的一些點(diǎn)。你掌握了這些點(diǎn)以后,可以說讓大家在應(yīng)對(duì)筆試面試的時(shí)候不會(huì)這個(gè)遇到一些障礙。

  • 我們還會(huì)在我們的AssetBundle里面去給大家講解傳統(tǒng)的AssetBundle的熱更新的框架,熱更新如何實(shí)現(xiàn)。那么那么關(guān)于進(jìn)一步的學(xué)習(xí)內(nèi)容呢需要更多的時(shí)間。

  • 可以添加我們的老師領(lǐng)取更多公開課。

  • 更多學(xué)習(xí)資源請(qǐng)加QQ:1517069595獲?。?企業(yè)級(jí)性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對(duì)一指導(dǎo))

    完整視頻可以點(diǎn)擊B站鏈接:https://www.bilibili.com/video/BV1KU4y1L72h/




一小時(shí)極速掌握游戲資源遠(yuǎn)程熱更新的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
绥宁县| 隆林| 县级市| 西贡区| 台湾省| 成武县| 车致| 临猗县| 大连市| 玉门市| 商丘市| 湘阴县| 泸定县| 丰宁| 当阳市| 凭祥市| 陈巴尔虎旗| 周宁县| 东平县| 平顶山市| 石泉县| 天峨县| 昌宁县| 阜康市| 沽源县| 明光市| 资源县| 崇阳县| 来凤县| 治县。| 龙胜| 金坛市| 平遥县| 马公市| 郯城县| 拜泉县| 固阳县| 平乐县| 渭源县| 洪江市| 西丰县|