---
# System prepended metadata

title: egret 物件釋放&回收
tags: [Egret]

---

# 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`