Cocos2d-x 沿用 Objective-C 的手動引用計數體系,核心類 Ref 提供:
retain():引用計數 +1release():引用計數 -1,歸零時調用 ~Ref() 釋放內存autorelease():標記為「稍後釋放」,放入當前 PoolManager 的釋放池// 每幀渲染循環 (CCDirector::mainLoop)
void Director::mainLoop() {
// 1. 進入新幀,創建新的釋放池
PoolManager::getInstance()->push();
// 2. 執行邏輯更新、渲染、事件處理
// 期間創建的臨時對象調用 autorelease() 入池
update(delta);
render();
// 3. 幀結束,彈出釋放池,統一清理計數為 0 的對象
PoolManager::getInstance()->pop();
}
/* 手動管理:創建者負責 release */
CCPoint *p = new CCPoint(x, y);
array->addObject(p); // array 內部 retain()
p->release(); // 放棄所有權,array 持有
/* 自動管理:適用於工廠方法、臨時對象 */
CCString *str = new CCString("text");
str->autorelease(); // 下一幀結束自動 release
return str; // 調用者若需長期持有需自行 retain()
| API | 行為 | 適用場景 | 內存影響 |
|---|---|---|---|
pushScene() | 壓入棧頂,舊場景保留 | 對話框、暫停菜單、需快速返回 | 疊加佔用,需防 OOM |
popScene() | 彈出棧頂,銷毀當前,恢復前一個 | 返回上一級 | 釋放當前場景資源 |
replaceScene() | 銷毀當前,直接切換新場景 | 大場景切換(主選單↔遊戲關卡) | 峰值內存低,推薦首選 |
// 1. 主動清理紋理緩存(佔 90%+ 內存) Director::getInstance()->getTextureCache()->removeUnusedTextures(); // 或徹底清空 Director::getInstance()->purgeCachedData(); // 2. 切換場景前釋放 Director::getInstance()->purgeCachedData(); auto newScene = GameScene::create(); Director::getInstance()->replaceScene(newScene);
.pvr.ccz (PVRT 压缩 + gzip),GPU 直接解碼,無需 CPU 解壓。RGBA4444 (16bpp) 替代 RGBA8888 (32bpp),內存減半,質量可接受。.mp3 (硬解) / .ogg (軟解,Android/iOS 皆支援)。Texture2D::setDefaultAlphaPixelFormat(backend::PixelFormat::RGBA4444) 設置全局預設格式。Configuration::getInstance()->setValue("texture_npot", true) 支持非 2 的冪次(需 GPU 支持)。Allocator 減少碎片。TextureCache 強制釋放策略(LRU + 引用計數)。dumpCachedTextureInfo()CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
輸出示例:
cocos2d: "cc_fps_images" rc=5 id=3 256 x 32 @ 16 bpp => 16 KB cocos2d: "actor.pvr.ccz" rc=1059 id=4 2048 x 2048 @ 32 bpp => 16384 KB cocos2d: CCTextureCache dumpDebugInfo: 2 textures, for 16400 KB (16.02 MB)
rc:引用計數,長期為 1 疑似洩漏。bpp:bits per pixel,驗證壓縮格式是否生效。libs 文件夾(移除舊源碼引用)。cocos2d-ios.xcodeproj 作為子項目。-fobjc-arc),子項目 禁用 ARC (-fno-objc-arc)。Bridging-Header.h) 中 #import "cocos2d.h"。Cocos2d-x 內存管理的核心是規範的所有權轉移:
create/new,誰負責 release 或 autorelease。Vector/Map) add 時 retain,remove 時 release。replaceScene,必要時 purgeCachedData。dumpCachedTextureInfo 定期巡檢,防微杜漸。