iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
Vibe Coding

上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲系列 第 16 篇

Day 16:雙遊戲平台場景切換與記憶體管理 —— Scene Manager、GC 釋放與 Object Pool

  • 分享至 

  • xImage
  •  

歡迎來到第十六天!當大廳、青花瓷遊戲、雪花冰遊戲三個場景頻繁切換時,最讓人頭疼的就是 WebGL 記憶體洩漏與垃圾回收(Garbage Collection) 問題。


1. 物件池(Object Pooling)避免 GC Pause 實作

在雪花冰遊戲中,當玩家連續點擊配料時,如果頻繁 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()
    }
}


2. 場景切換與 VRAM 資產釋放

// 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 資產`);
        }
    });
}


💡 鐵人賽小知識:WebGL 的 Context Lost 症狀與防範措施

> Tech Tip:在手機 Safari 或 Chrome 中,如果背景 App 佔用過多記憶體,作業系統會強制拔除當前 WebView 的 WebGL Context(觸發 webglcontextlost 事件),導致遊戲瞬間變成黑屏或白屏。預防之道除了落實 releaseUnusedAssets() 外,還可以監聽 canvas.addEventListener('webglcontextlost'),在 Context 遺失時跳出「網路或記憶體不足,請刷新頁面」的友善提示。


上一篇
Day 15:門市點數與防弊演算法 —— Server-Authoritative 模式、HMAC 簽章
系列文
上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言