關(guān)于內(nèi)存:
在創(chuàng)建C#對象push到lua前,slua都會把對象存放到ObjectCache,引用著,防止被釋放。
舉個栗子說明:
創(chuàng)建一個Gameobject A,然后給A增加一個Image組件,Image綁定一張Texture2D B,那么馬上Destroy A,即便執(zhí)行了C#的內(nèi)存回收,也不會回收掉紋理B的內(nèi)存。因為ObjectCache依舊引用著紋理B,但是ObjectCache中A和它的組件會置為null。
這時,需要執(zhí)行l(wèi)ua的collectgarbage, 才能把紋理B從Cache里去除,從而把內(nèi)存降下來。
簡單來說,你在lua中操作過的每一個對象都會記錄在ObjectCache里(組件也是對象),當(dāng)你Destroy后,ObjectCache的記錄會為null(這是C#做的,Dictionary中key為弱引用),但是你Destroy對象,不代表能把內(nèi)存清理干凈,例如上面栗子中的紋理B,它在lua中被創(chuàng)建出來,是需要執(zhí)行l(wèi)ua的GC,才能把B清理掉。
還有切場景,切場景會主動釋放場景中的對象,這里是C#進行的,不管lua有沒引用著(所以還是會出現(xiàn)類似"野指針"的問題)
至于<不在場景>中的對象會不會自動釋放 ? 我還需要測試下,個人推測是受lua引用影響的,所以如果創(chuàng)建了紋理之類的資源,不要用全局變量引用,而是用local,然后就等待切場景時GC自動回收