[回到版面]
回應模式
名 稱
E-mail
標 題
內 文
附加圖檔[] []
刪除用密碼(刪除文章用。英數字8字元以內)
  • 可附加圖檔類型:GIF, JPG, PNG, JPEG,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 10000 KB。當回文時E-mail填入sage為不推文功能
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 程式碼可使用 [code][/code] 以 google-code-prettify 標亮 (程式自動判斷語言類別)

  • 公告、舉報、建議請向DB管理室辦理。
  • 本板討論遊戲製作為主,改造方面也可討論,但如果牽涉到版權,請自重。
  • 3D建模請至3D板, 3D遊戲製作(Ex.怎麼用DirectX跑3D?)則可在這討論。
  • 本板為一般向板面,禁止張貼上車圖。

檔名:1492022803534.jpg-(352 KB, 1500x1500) [以預覽圖顯示]
352 KBUnity Resources.Load 名稱: 無名氏 [17/04/13(四)02:46 ID:eulOXGcY] No.12672  
Resources.LoadAsync
Resources.Load

看了許多文章還是不太明白
可以解釋成Resources.Load一定要讀取完才會進行下一個Frame
而Resources.LoadAsync則是異步讀取,在每一個Frame完成它

那為了避免卡頓的情況下,其實可以將Resources.Load都換成Resources.LoadAsync的理解正確嗎?

看了很多Sample都是用Resources.Load而非LoadAsync
兩者有那些優劣,不知道有沒有人能分享一下
先說我沒用過Unity,只是照程式慣例講 名稱: 無名氏 [17/04/13(四)03:38 ID:d8u5NLP2] No.12673 1推  
在程式語言慣例中
Async的意思是他會在背景執行,而不會馬上完成

Load是一個很花時間的動作(對CPU而言)
如果你用Resources.Load
程式會在這邊花上很長一段時間等待他Load完成才繼續執行下去
但如果是LoadAsync,這個function會馬上回傳
你的程式不會在這邊花費時間,而是直接往下走
而這個Load的動作會在背景自己找時間做
但是在他背景執行完成之前,這個資源是不完整、不能被使用的
如果你在LoadAsync背景執行期間動用了這個資源,可能會導致當機

例如你希望在玩家還在2號地圖的時候先讀取3號地圖的資料,讓切換地圖無讀取時間,就要用到LoadAsync
例如一個被魔法召喚出來的角色,無預兆地瞬間出現在玩家眼前
他的模組必須馬上被讀取並顯示,就用Load

簡單來說
Resources.Load比較安全但也比較慢
Resources.LoadAsync則是比較高級的技巧,需要你搞懂他才能妥善使用,沒搞懂就亂用會是一場災難
如果你看完還是不懂,就乖乖用Resources.Load
baka: (´∀((☆ミつ<話說我也還沒用過LoadAsync,不竟我很少會做無縫讀取。 (MKdmva6s 17/04/13 09:08)
無標題 名稱: 無名氏 [17/04/13(四)17:27 ID:1NurIzWo] No.12674   
沒在用Resources.LoadAsync
不過也是照程式慣例講

就像>>No.12673說的
Resources.LoadAsync在讀取時不會等到讀取完就會直接進入後面的動作
如果你是為了避免卡頓而把Resources.Load全換成Resources.LoadAsync
那反而會發生讀取的內容跟你想表現的內容不同步的狀況

比方說用Resources.LoadAsync讀取圖片
可能會造成圖片都還沒讀取完就執行下一個動作了
這種時候很容易發生破圖,因為你圖片沒有讀取完
如果用Resources.LoadAsync讀取音樂音效
譬如說爆炸聲,可能你東西都炸光了聲音才冒出來
因為程式沒等聲音讀取完就進行下一個動作了

重點是你要不要即時看到讀取的內容
如果是,就要用Resources.Load
因為Resources.Load會讀取完才進行下一個動作
缺點是如果檔案太大就會發生你說的卡頓現象

但如果你能預測之後才需要讀取這個要讀取很久的檔案
那就可以用Resources.LoadAsync預先載入
在使用時就不必再花太多時間讀取
無標題 名稱: 無名氏 [17/04/13(四)20:26 ID:7cH4CHIA] No.12675   
Load是回傳Object
也就是調用的時候,在得到這個物件前,你的code都會被卡在這一行

LoadAsync則是回傳ResourceRequest
ResourceRequest裡可以檢查讀取進度
當你調用LoadAsync的時候,會獲得ResourceRequest
ResourceRequest把他想成一個幫你在背後Load的物件
透過ResourceRequest.isDone來檢查是否完成

舉個例子來說
用Load來做轉場,code執行到Load時就會等待東西全部載好
畫面就整個卡住(你的code被卡在Load那行,你什麼都不能做)

用LoadAsync來做轉場,則是獲得ResourceRequest
然後可以Update來檢查ResourceRequest.progress的進度
畫面上可以更新一些進度條,或是一些互動等等
code還是在Update
無標題 名稱: 原PO [17/04/13(四)21:22 ID:eulOXGcY] No.12676   
我是原PO,感謝各位的回復 m(_ _)m
最近在思索Resources.LoadAsync的實戰用法用到什麼上面好
之前都很單純的用Resources.Load而已

目前有一個想法是,當讀取較大的東西(例如解析度高的圖片)
先用一張很小的圖片當做墊檔物,然後執行Resources.LoadAsync來讀這張圖片
等好了之後,再將高解析圖片換上的作法,不過還沒實際用過

之前寫都是將這場景可能會用的圖片,在讀入場景的時候就一起載入了
但總覺得很多細節之處不甚理想,所以想思索Resources.LoadAsync來緩解一些效能的狀況
無標題 名稱: 無名氏 [17/04/14(五)18:24 ID:Xm/1HvEs] No.12677   
>>No.12676
你要先想想你的效能瓶頸在哪(哪邊會頓)
再評估一下自己的程式功力到哪
來決定要怎麼用這個Async

像你說你都一次載入
就可以用Async來做動態讀取條
在畫面上灑個花啊什麼的讓玩家比較不會覺得無聊,還能看到進度條在跑
而且技術上也比較簡單,反正全部讀完了才進場景,不會發生沒讀完就使用的問題

但理論上來說,用一次載入制度就不應該導致其他地方因為讀取資源而lag
如果你覺得你現在的程式有lag的話,應該是其他因素造成的
就算整個程式的Load都改成Async也不會有幫助


用低解析度墊檔是個可行的主意
但是那建立在你整個程式要是動態讀取(玩家走到哪讀到哪)的前提下
這個機制本身非常複雜,可能要評估一下你能不能控制得了
簡單一點的做法是進場景時把整個場景的低解析度版都讀完
然後在玩家亂跑期間一個一個把高解析版用Async讀起來,按照自己的順序不管玩家走到哪
這樣可以大幅縮短進場讀取時間,又不像零讀取那麼難做
之後有興趣再慢慢改成偵測玩家位置來選擇要讀什麼
無標題 名稱: 原PO [17/04/14(五)21:54 ID:spJ9bmwA] No.12678   
目前想練習將一次到位的方法轉換成動態讀取的方式
這樣玩家在沒用到的情況下,應該會省下讀取時間跟記憶體

蠻多遊戲有一張2D圖是低解析版本,等玩家點圖才開始讀取高解析
或是場景物件是馬賽克,等一段時間後才會變成完整的圖

如果用兩份資源顯得有點蠢,因為容量也多了一倍
如果我想做類似這種東西(例如圖片)

不知道Unity有這種讀取資源的機制嗎?
(同一份資源讀不同的品質,非編輯器設定而是動態讀取)

或是我該用什麼關鍵字去尋找這類資源的文章?謝謝~~~
無標題 名稱: 無名氏 [17/04/15(六)01:26 ID:mn2TkudQ] No.12679 2推  
>No.12678
就我所知來說
如果真要加快讀取速度.真的就只有放2份資源這種方式
而且就是放低品質圖了.容量絕對遠低於一倍

不過如果是想增加渲染速度的話.方法就多很多
無名氏: 原因的話.就我所知如果要動態變更品質.不管如何都必須先讀原始資源這裡就不可能降低讀取速度. (mn2TkudQ 17/04/15 01:29)
無名氏: 再加上額外的運算.反而只會花更多時間 (mn2TkudQ 17/04/15 01:29)
無標題 名稱: 原PO [17/04/15(六)17:36 ID:ebaPvOKM] No.12680   
兩種品質圖也就是用容量去換取速度跟品質嗎 Σ(°▽°)
那我大概知道這種作法了

增加渲染速度...是指圖片類的嗎?
3D好像是降低draw calls
2D有將小UI圖片併成一張大圖
除此之外還有什麼比較需要注意的方法嗎?
無標題 名稱: 無名氏 [17/04/15(六)18:53 ID:Fn1JncO6] No.12681 1推  
>>No.12680
>>兩種品質圖也就是用容量去換取速度跟品質嗎 Σ(°▽°)
題外話
其實是有技術可以讓不同品質的圖不吃額外容量
png跟jpg都有官方支援,輸出圖檔的時候可以選擇要不要採用
他會在一個檔案裡先放低品質的再放高品質,但是高品質會忽略掉低品質已有的資訊
結論來說整個圖檔不會顯著地變大(但壓縮率會變差,所以還是稍微大一點)
有時在網路上點開比較大張的圖片,會看到畫質慢慢由壞變好就是這個原因
反之,如果圖片是用完整畫質由上到下出現,就代表那張圖輸出時沒有採用這個技術

不過這是png與jpg的功能,不是Unity的
所以講這些都是題外話
除非Unity也有刻意去支援這個功能
不然你還是要把圖放兩份

我是建議原PO不要擔心容量變大的問題
這年頭硬碟空間便宜得要命
在程式開發時,資源的珍貴程度一般來說是:CPU運算時間>記憶體空間>硬碟空間
為了節省CPU運算,可以盡量使用記憶體跟硬碟空間
只要不是大到超乎常理的程度就不用擔心
圖檔加個一兩倍不會怎樣,更別說你這個大概只加5~20%而已
原PO: 這幾天加班忙忘了回,感謝大大回覆,我再多研究~ (VTfxXYA. 17/04/19 01:11)
無標題 名稱: 無名氏 [17/04/15(六)19:33 ID:UiycsaqU] No.12682 1推  
像tga和png這兩種都帶有rgba的格式
unity build出來大小都是一樣的嗎?
是因為unity還會再轉換格式一次?
無名氏: 實測看看,如果一樣就代表Unity自己會轉換,不一樣就代表他直接把原檔存進去 (Airr9bFk 17/04/16 16:43)

【刪除文章】[]
刪除用密碼:
第一頁[0] 最後一頁