歡迎來到第十六天!當大廳、青花瓷遊戲、雪花冰遊戲三個場景頻繁切換時,最讓人頭疼的就是 WebGL 記憶體洩漏與垃圾回收(Garbage Collection) 問題。
在雪花冰遊戲中,當玩家連續點擊配料時,如果頻繁 instantiate() 新建節點、destroy() 銷毀節點,會引發 JavaScript 引擎頻繁觸發 GC,導致遊戲畫面瞬間卡頓(Stuttering)。
我們實作了 NodePool 管理器:
// ItemObjectPool.ts
import { _decorator, Component, Node, NodePool, Prefab, instantiate } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('ItemObjectPool')
export class ItemObjectPool extends Component {
@property(Prefab)
private ingredientPrefab: Prefab = null!;
private pool = new NodePool();
// 取得物件
public getIngredientNode(): Node {
if (this.pool.size() > 0) {
return this.pool.get()!; // 從池中回收使用
} else {
return instantiate(this.ingredientPrefab); // 池空了才建立新物件
}
}
// 回收物件
public recycleIngredientNode(node: Node) {
node.removeFromParent();
this.pool.put(node); // 放回池中,不呼叫 destroy()
}
}
// SceneLoader.ts
import { director, assetManager } from 'cc';
export function safeChangeScene(targetScene: string) {
director.loadScene(targetScene, (err) => {
if (!err) {
// 切換成功後,強制釋放未被引用的 Texture2D 與 AudioSource
assetManager.releaseUnusedAssets();
console.log(`[Memory] 成功切換至 ${targetScene},已清理未引用 VRAM 資產`);
}
});
}
> Tech Tip:在手機 Safari 或 Chrome 中,如果背景 App 佔用過多記憶體,作業系統會強制拔除當前 WebView 的 WebGL Context(觸發 webglcontextlost 事件),導致遊戲瞬間變成黑屏或白屏。預防之道除了落實 releaseUnusedAssets() 外,還可以監聽 canvas.addEventListener('webglcontextlost'),在 Context 遺失時跳出「網路或記憶體不足,請刷新頁面」的友善提示。