關(guān)于內(nèi)存:
在創(chuàng)建C#對(duì)象push到lua前柒啤,slua都會(huì)把對(duì)象存放到ObjectCache,引用著,防止被釋放钳榨。
舉個(gè)栗子說(shuō)明:
創(chuàng)建一個(gè)Gameobject A,然后給A增加一個(gè)Image組件纽门,Image綁定一張Texture2D B薛耻,那么馬上Destroy A,即便執(zhí)行了C#的內(nèi)存回收膜毁,也不會(huì)回收掉紋理B的內(nèi)存昭卓。因?yàn)镺bjectCache依舊引用著紋理B,但是ObjectCache中A和它的組件會(huì)置為null瘟滨。
這時(shí)候醒,需要執(zhí)行l(wèi)ua的collectgarbage, 才能把紋理B從Cache里去除杂瘸,從而把內(nèi)存降下來(lái)倒淫。
簡(jiǎn)單來(lái)說(shuō),你在lua中操作過(guò)的每一個(gè)對(duì)象都會(huì)記錄在ObjectCache里(組件也是對(duì)象)败玉,當(dāng)你Destroy后敌土,ObjectCache的記錄會(huì)為null(這是C#做的镜硕,Dictionary中key為弱引用),但是你Destroy對(duì)象返干,不代表能把內(nèi)存清理干凈兴枯,例如上面栗子中的紋理B,它在lua中被創(chuàng)建出來(lái)矩欠,是需要執(zhí)行l(wèi)ua的GC财剖,才能把B清理掉。
還有切場(chǎng)景癌淮,切場(chǎng)景會(huì)主動(dòng)釋放場(chǎng)景中的對(duì)象躺坟,這里是C#進(jìn)行的,不管lua有沒(méi)引用著(所以還是會(huì)出現(xiàn)類似"野指針"的問(wèn)題)
至于<不在場(chǎng)景>中的對(duì)象會(huì)不會(huì)自動(dòng)釋放 乳蓄? 我還需要測(cè)試下咪橙,個(gè)人推測(cè)是受lua引用影響的,所以如果創(chuàng)建了紋理之類的資源虚倒,不要用全局變量引用美侦,而是用local,然后就等待切場(chǎng)景時(shí)GC自動(dòng)回收