AssetBundle異步加載被中斷的問(wèn)題

1)AssetBundle異步加載被中斷的問(wèn)題

2)LuaDLL.lua_pcall()自身產(chǎn)生開(kāi)銷(xiāo)問(wèn)題

3)法線在手機(jī)渲染時(shí)出現(xiàn)的錯(cuò)誤問(wèn)題

4)UNITY_MATRIX_I_V 和Camera.main.worldToCameraMatrix.inverse區(qū)別

這是第272篇UWA技術(shù)知識(shí)分享的推送烁峭。今天我們繼續(xù)為大家精選了若干和開(kāi)發(fā)句柠、優(yōu)化相關(guān)的問(wèn)題,建議閱讀時(shí)間10分鐘常侣,認(rèn)真讀完必有收獲。

UWA 問(wèn)答社區(qū):answer.uwa4d.com

UWA QQ群2:793972859(原群已滿員)

Resources

Q:在使用異步接口yield return AssetBundle.ASyncLoad的時(shí)候弹渔,難免會(huì)想到:這個(gè)異步處理完之前如何Cancel掉這個(gè)任務(wù)胳施?也就是說(shuō)一個(gè)AssetBundle加載到一半,現(xiàn)在要放棄加載肢专,應(yīng)該怎么處理舞肆?

A1:其實(shí)底層調(diào)用GetAssetBundleBlocking,會(huì)在這個(gè)函數(shù)內(nèi)部調(diào)用PreloadManager的加載更新邏輯博杖,其實(shí)就是把Async操作改成了Sync了椿胯,會(huì)一直阻塞到AssetBundle加載成功。

但是也有坑剃根,這兒因?yàn)閳?zhí)行了PreloadManager.UpdatePreloading哩盲,內(nèi)部還會(huì)做GC。遇到過(guò)把不應(yīng)該卸載的資源給卸載了狈醉,說(shuō)是Unused廉油,但是實(shí)際正在使用。

感謝黃程@UWA問(wèn)答社區(qū)提供了回答

A2:資源加載管理的第一難題就是異步IO怎么被Cancel掉苗傅,或者說(shuō)從設(shè)計(jì)上怎么去實(shí)現(xiàn)等同的效果抒线。

但是相對(duì)于從Flash到Cocos到Unity來(lái)說(shuō),Unity還是做的很好的金吗。之前的任何引擎要處理好這個(gè)問(wèn)題十兢,非常之困難趣竣,需要很多代碼的支持,包括多線程更低層次的相關(guān)代碼旱物。這一塊Unity做得非常好遥缕,我們不用絞盡腦汁去實(shí)現(xiàn)異步IO Cancel的問(wèn)題,只需要做好上層架構(gòu)宵呛,設(shè)計(jì)出類似的功能单匣。

Unity的異步加載會(huì)返回一個(gè)Request對(duì)象,該對(duì)象有一個(gè)Get屬性AssetBundle宝穗,仔細(xì)查看該Get函數(shù)API會(huì)發(fā)現(xiàn)户秤。當(dāng)調(diào)用該屬性時(shí),會(huì)促使底層異步IO中斷(具體怎么實(shí)現(xiàn)的逮矛,有C++源碼的才能知道)鸡号,并立即同步加載該資源,且回調(diào)须鼎,回調(diào)順序是和你調(diào)用順序相當(dāng)?shù)模ū热绠惒郊虞d調(diào)用了2次并設(shè)置了回調(diào)鲸伴,現(xiàn)在觸發(fā)中斷并立即完成,會(huì)優(yōu)先回調(diào)異步設(shè)置的回調(diào))晋控。

所以基于這個(gè)設(shè)計(jì)一個(gè)好的引用計(jì)數(shù)器管理資源非常重要汞窗。

大部分項(xiàng)目的引用計(jì)數(shù)器設(shè)計(jì)都是待資源完成后添加引用計(jì)數(shù)。這種設(shè)計(jì)的適用場(chǎng)景非常局限赡译。在大型項(xiàng)目中使用環(huán)境非常復(fù)雜的資源加載情況下(異步加載中調(diào)用同步仲吏,異步加載中需要取消,異步加載中取消后立即同步等)會(huì)出現(xiàn)非常多的未知問(wèn)題和開(kāi)發(fā)中的局限性蝌焚,這種設(shè)計(jì)只適合微型項(xiàng)目快速開(kāi)發(fā)裹唆。

所以一個(gè)完備的引用計(jì)數(shù)設(shè)計(jì)應(yīng)該是調(diào)用加載方法時(shí),就生成該資源未來(lái)被加載完成后的數(shù)據(jù)殼子综看,并添加引用計(jì)數(shù)(因?yàn)榧虞d本身其實(shí)也是一次引用品腹,包括bundle.AsynLoadAsset,其實(shí)任何的異步加載自身都需要添加一次引用红碑,防止上層代碼的邏輯舞吭,造成引用計(jì)數(shù)器非法=0觸發(fā)bundle.unload方法),完成后減少引用計(jì)數(shù)析珊。那么同步加載時(shí)需要查找數(shù)據(jù)殼子羡鸥,如果該資源正在異步加載,需要調(diào)用其request.assetBundle讓其立即中斷異步并立即同步完成加載忠寻。(否則同步加載時(shí)底層會(huì)拋出警告惧浴。)

基于這個(gè)我們可以設(shè)計(jì)一套非常完備的Cancel系統(tǒng),上層調(diào)用Cancel時(shí)奕剃,其實(shí)就是讓其外部引用-1衷旅,因?yàn)槔碚撋衔覀兡苣玫降乃薪涌跓o(wú)法真正中斷一次IO捐腿,只有待其加載完成后,發(fā)現(xiàn)引用計(jì)數(shù)等于0時(shí)柿顶,才會(huì)Unload掉資源茄袖。

設(shè)計(jì)思路這里只是拋出一點(diǎn),具體怎么去實(shí)現(xiàn)和設(shè)計(jì)各抒己見(jiàn)嘁锯。只是如果一個(gè)資源管理器不能適應(yīng)任何(絕大部分)加載情形宪祥,那么這還是一個(gè)資源管理器嗎?

感謝1 9 7 3-311135@UWA問(wèn)答社區(qū)提供了回答家乘,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5af3db530e95a527a7a81d31

Lua

Q:為什么LuaDLL.lua_pcall()自身會(huì)產(chǎn)生這么大的開(kāi)銷(xiāo)蝗羊?

A1:是不是Lua自身邏輯消耗比較高,這個(gè)可以看Lua側(cè)的消耗:《Lua Profiler——快速定位Lua性能問(wèn)題》仁锯。

感謝jjjzzz@UWA問(wèn)答社區(qū)提供了回答

A2:lua_pcall只是通過(guò)壓棧的方式調(diào)用了Lua耀找,具體消耗還得在Lua那邊看看,估計(jì)是某函數(shù)C#和Lua瘋狂調(diào)用比較厲害业崖。

感謝蕭小俊@UWA問(wèn)答社區(qū)提供了回答

A3:用DeepProfile才能知道具體是哪個(gè)方法調(diào)用高涯呻,這里只是C# call到Lua,后面的棧信息已經(jīng)沒(méi)有了腻要,不能單純的說(shuō)LuaDLL.lua_pcall()開(kāi)銷(xiāo)大。

感謝1 9 7 3-311135@UWA問(wèn)答社區(qū)提供了回答涝登,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/606184ecafbc233466c02c80

Rendering

Q:法線在手機(jī)渲染時(shí)出現(xiàn)的錯(cuò)誤問(wèn)題:

用的版本是Unity 2019.4 URP雄家。Editor模式下是正確的,在默認(rèn)Unity Build的打包正確胀滚,將資源打成AssetBundle后渲染出現(xiàn)錯(cuò)誤趟济。Shader使用了多種,包括默認(rèn)的Lit Shader咽笼,都會(huì)出現(xiàn)該問(wèn)題顷编。

A:懷疑是渲染管線的Shader問(wèn)題,變體收集問(wèn)題剑刑,最后一一排除后變成Mesh問(wèn)題媳纬。有好大哥MoMo的奶爸告訴我,Unity部分版本的Optimize Mesh Data選項(xiàng)默認(rèn)打開(kāi)施掏,會(huì)優(yōu)化掉部分網(wǎng)格钮惠,導(dǎo)致以上的問(wèn)題。

感謝題主霸氣九號(hào)@UWA問(wèn)答社區(qū)提供了回答七芭,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/616e6d248f8c834241e4f742

Rendering

Q:URP中Shader的UNITY_MATRIX_I_V 和C#中Camera.main.worldToCameraMatrix.inverse獲取到的矩陣并不一樣素挽,在Shader中用ViewSpace的坐標(biāo)乘以UNITY_MATRIX_I_V并不能夠得到正確的世界坐標(biāo),乘以Camera.main.worldToCameraMatrix.inverse則可以狸驳,請(qǐng)問(wèn)他們二者的區(qū)別是什么呢预明?

A:我這邊做的測(cè)試并沒(méi)有發(fā)現(xiàn)這兩個(gè)矩陣有什么不同缩赛。

在Shader中修改Frag來(lái)調(diào)用UNITY_MATRIX_I_V:

在C#中打印這個(gè)矩陣,從Frame Debugger和控制臺(tái)輸出的結(jié)果來(lái)看這兩個(gè)矩陣沒(méi)有什么不同撰糠。

使用URP的Shader Simple Lit酥馍,計(jì)算逆矩陣之后的結(jié)果也是一致的:

感謝宗卉軒@UWA問(wèn)答社區(qū)提供了回答,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/616d6b2c8f8c834241e38f1d

20211025

更多精彩問(wèn)題等你回答~

Unity增量打包AssetBundle沒(méi)變化的資源也會(huì)被重新打包

在模型有UV2的情況下開(kāi)啟Generate Lightmap UVs

如何實(shí)現(xiàn)AAB包的增量更新

封面圖來(lái)源于網(wǎng)絡(luò)

今天的分享就到這里窗慎。當(dāng)然物喷,生有涯而知無(wú)涯。在漫漫的開(kāi)發(fā)周期中遮斥,您看到的這些問(wèn)題也許都只是冰山一角峦失,我們?cè)缫言赨WA問(wèn)答網(wǎng)站上準(zhǔn)備了更多的技術(shù)話題等你一起來(lái)探索和分享。歡迎熱愛(ài)進(jìn)步的你加入术吗,也許你的方法恰能解別人的燃眉之急尉辑;而他山之“石”,也能攻你之“玉”较屿。

官網(wǎng):www.uwa4d.com

官方技術(shù)博客:blog.uwa4d.com

官方問(wèn)答社區(qū):answer.uwa4d.com

UWA學(xué)堂:edu.uwa4d.com

官方技術(shù)QQ群:793972859(原群已滿員)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隧魄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隘蝎,更是在濱河造成了極大的恐慌购啄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘱么,死亡現(xiàn)場(chǎng)離奇詭異狮含,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)曼振,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)几迄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冰评,你說(shuō)我怎么就攤上這事映胁。” “怎么了甲雅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵解孙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我务荆,道長(zhǎng)妆距,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任函匕,我火速辦了婚禮娱据,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己中剩,他們只是感情好忌穿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著结啼,像睡著了一般掠剑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郊愧,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天朴译,我揣著相機(jī)與錄音,去河邊找鬼属铁。 笑死眠寿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的焦蘑。 我是一名探鬼主播盯拱,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼例嘱!你這毒婦竟也來(lái)了狡逢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拼卵,失蹤者是張志新(化名)和其女友劉穎奢浑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腋腮,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殷费,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了低葫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仍律,死狀恐怖嘿悬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情水泉,我是刑警寧澤善涨,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站草则,受9級(jí)特大地震影響钢拧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炕横,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一源内、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧份殿,春花似錦膜钓、人聲如沸嗽交。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夫壁。三九已至,卻和暖如春沃疮,著一層夾襖步出監(jiān)牢的瞬間盒让,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工司蔬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑茄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓葱她,卻偏偏與公主長(zhǎng)得像撩扒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吨些,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 1)Shader打AssetBundle包變體丟失問(wèn)題 2)Unity升級(jí)后在iOS平臺(tái)的貼圖導(dǎo)入問(wèn)題 3)字體文...
    侑虎科技UWA閱讀 580評(píng)論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者搓谆,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)豪墅,也就放棄了無(wú)數(shù)的可能泉手。 ...
    yichen大刀閱讀 6,057評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,888評(píng)論 0 2
  • 今天上午陪老媽看病,下午健身房跑步偶器,晚上想想今天還沒(méi)有斷舍離斩萌,馬上做,衣架和旁邊的的布衣架屏轰,一看亂亂颊郎,又想想自己是...
    影子3623253閱讀 2,916評(píng)論 1 8