第一次加載資源時,內(nèi)存中保存了該資源的一份數(shù)據(jù),并初始化該資源的引用數(shù)量為1,隨后每次加載該資源時,對該引用數(shù)量加1.
Release 實(shí)際上只是將資源的引用數(shù)量減1,也就是LoadAssetsAsync 了多少次,就要Release 多少次。
使用LoadAssetsAsync 加載資源時,同一個key 返回的AsyncOperationHandle 是同一個,但使用AsyncOperationHandle Release LoadAssetsAsync 加載的同一個資源時,仍然需要遵循調(diào)用LoadAssetsAsync多少次,就要Release 多少次。
使用InstantiateAsync 加載并實(shí)例化資源時,同一個key 返回不同的AsyncOperationHandle<GameObject>。
每一次調(diào)用InstantiateAsync 都會增加資源的引用數(shù)量,內(nèi)部應(yīng)該是先調(diào)用了LoadAssetsAsync 相同的流程,然后實(shí)例化。
釋放InstantiateAsync 加載并實(shí)例化的資源時,需要對每個AsyncOperationHandle<GameObject> 進(jìn)行釋放,或釋放每個實(shí)例化的GameObject。
釋放InstantiateAsync 加載并實(shí)例化的資源時,使用Release 和ReleaseInstance 的行為是完全相同的,他們都會銷毀資源的實(shí)例,并且減少資源的引用。
釋放LoadAssetsAsync?加載的資源時,不會銷毀該資源的實(shí)例,如果這些實(shí)例在其資源被卸載前沒有被銷毀,他們可能會丟失資源引用,在游戲中表現(xiàn)為材質(zhì)丟失、模型丟失等。
使用AssetReference.InstantiateAsync?加載時,不能使用AssetReference.ReleaseAsset?釋放,使用AssetReference.ReleaseInstance?或者Addressables.Release?及Addressables.ReleaseInstance?均可,其行為表現(xiàn)一致,均是銷毀資源實(shí)例,并將該資源的引用減1.
使用AssetReference.LoadAssetsAsync?加載時,可以使用AssetReference.ReleaseAsset?釋放,也可以使用Addressables.Release?釋放,其行為表現(xiàn)一致,均是將該資源的引用減1.
當(dāng)調(diào)用Addressables.InstantiateAsync 時,將trackHandle 設(shè)置為false 時,僅能通過AsyncOperationHandle 來釋放資源。
Release AsyncOperationHandle 時,會減少資源的引用數(shù)量,當(dāng)使用該AsyncOperationHandle?加載的資源都被釋放時,才會invalidates AsyncOperationHandle。這意味著多次調(diào)用LoadAssetAsync?對同一資源加載若干次,僅當(dāng)該資源被Release?相同次數(shù)時,該AsyncOperationHandle?才會invalid;而使用InstantiateAsync?對同一資源加載并實(shí)例化若干次時,每次Release?某個實(shí)例都僅會令加載并實(shí)例化它的AsyncOperationHanle?invalid。?
當(dāng)資源的引用數(shù)量減為0時,資源占用的內(nèi)存并不會立即釋放,而是等待資源所在AssetBoundle 被卸載時,才隨之釋放內(nèi)存。
當(dāng)AssetBoundle 中的資源被加載時(資源的引用數(shù)量加1),AssetBoundle 的引用數(shù)量加1,當(dāng)AssetBoundle 中的資源被Release 時(資源引用數(shù)量減1),AssetBoundle 的引用數(shù)量減1,當(dāng)AssetBoundle 引用數(shù)量減為0時,AssetBoundle 被卸載,其占用的內(nèi)存和其包含的所有被加載的資源所占用的內(nèi)存都被釋放。
當(dāng)加載AssetBoundle 中的資源時,AssetBoundle 的內(nèi)部數(shù)據(jù)會被加載到內(nèi)存中,這些數(shù)據(jù)有時候很多,通過平衡包體大小和數(shù)量來控制內(nèi)存占用和內(nèi)存優(yōu)化。
當(dāng)AssetBoundle 中的部分資源依賴另一個AssetBoundle 中的部分資源時,加載前者的任意資源都會使后者(的內(nèi)部數(shù)據(jù)和被依賴的資源)作為依賴包而被加載。
當(dāng)需要加載資源并且實(shí)例化多個時,使用LoadAssetsAsync 并保存handle,當(dāng)需要再次加載并實(shí)例化時,使用已經(jīng)保存的handle 加載,然后使用GameObject.Instantiate 實(shí)例化,如此,當(dāng)資源使用完畢后(如變換場景),只需通過Release handle一次來釋放資源。
使用InstantiateAsync 加載并且實(shí)例化資源時,如果傳入了transform 參數(shù),當(dāng)場景卸載時,如果該transform 位于場景中,那么對該資源的引用數(shù)會自動減1,無需手動調(diào)用Release API,但建議還是按照標(biāo)準(zhǔn)流程做。