# egret 物件釋放&回收 ## 前情提要 [javascript garbage collection](https://hackmd.io/ZyP2le6tTR6LyJNg-4qFKA) ## egret.Point :::info 內部有個 pool, 可用來回收 Point 物件 * egret.Point.create() 會嘗試從 pool 取出物件 * egret.Point.release() 會將物件丟回 pool * egret 內部許多功能, 例如 localToGlobal(), clone() 之類, 會直接 new egret.Point() ::: :::warning * 如果直接 new egret.Point(), 最後丟回 egret.Point.release() 會導致 pool 無限膨脹 ::: :::danger 錯誤用法 ```typescript= //內部會直接 new egret.Point() const pt = 某物件.localToGlobal(x, y); ... //可能會導致 pool 無限膨脹 //這種就不要透過 release() 回收, 而是遵循 js 的 GC 回收機制 egret.Point.release(pt); ``` ::: :::success 正確用法 ```typescript= //嘗試從 pool 取出 const pt = egret.Point.create(x, y); //會直接修改 pt 內容, 不額外產生新的物件 某物件.localToGlobal(pt.x, pt.y, pt); ... //回收到 pool egret.Point.release(pt); ``` ::: --- ## EXML 初始化 :::info * skin上物件綁定的class, 會在剛啟動就執行一次 constructor() ::: :::warning 已知的現象 * 如果 class 內的變數有使用 readonly, 會讓 class 實體保存在記憶體內 ::: --- ## particle.GravityParticleSystem :::warning 從場景上移除, 必須要先執行 stop() ::: --- ## 龍骨 :::success 在 console 印出所有使用中的龍骨 ```typescript= for(const item of dragonBones.EgretFactory.factory._dragonBones._clock._animatebles) console.log(item.name) ``` ::: --- ###### tags: `Egret`