Destroy rồi, sao Addressables vẫn giữ RAM?
Minh Khoa
Tác giả
Mở Shop, đóng Shop, gọi Destroy(). GameObject biến mất khỏi Hierarchy, nhưng Memory Profiler vẫn thấy texture của Shop nằm đó.
Chưa chắc Unity bị leak. Có thể mình mới xóa instance trong scene, còn quyền sử dụng asset vẫn chưa được trả lại.
Với Addressables dùng AssetBundle, cần nhìn cả hai tầng này.
1. Destroy object chưa có nghĩa đã release asset
Hãy hình dung Addressables giữ một “sổ mượn tài nguyên”.
Khi load hoặc instantiate, hệ thống ghi nhận lượt sử dụng. Khi release, lượt sử dụng tương ứng được trả lại. Đây là reference count của Addressables, không phải số biến C# đang trỏ tới object.
Nếu tạo bằng Addressables.InstantiateAsync() rồi chỉ gọi Destroy(), mình đã hủy instance nhưng chưa chủ động release operation đã tạo nó.
Cách dọn phụ thuộc vào cách tạo:
| Cách tạo | Cách giải phóng |
|---|---|
InstantiateAsync, mặc định trackHandle=true | Addressables.ReleaseInstance(gameObject) |
InstantiateAsync, đặt trackHandle=false | Giữ handle và dùng ReleaseInstance(handle) |
LoadAssetAsync rồi Object.Instantiate | Destroy các clone; sau cùng mới Release(loadHandle) |
Chọn cách release tương ứng, không release lặp cùng một lượt sử dụng. Unity — InstantiateAsync.
Unity có cơ chế tự release instance được theo dõi khi unload scene, nhưng asset được load riêng không tự được release theo cách đó. Đừng lấy “đổi màn chắc sẽ sạch” làm quy tắc quản lý tài nguyên. Unity — Unload assets.
2. Release đúng rồi, RAM vẫn có thể chưa giảm
Giả sử một bundle chứa:
-
Icon đồng xu trên HUD, dùng suốt trận.
-
Atlas của Shop, đã được load khi mở cửa hàng.
Đóng Shop và release hết phần Shop. Atlas không còn lượt sử dụng, nhưng HUD vẫn giữ icon đồng xu trong cùng bundle.
Theo luồng release thông thường của Addressables, bundle vẫn chưa unload, nên atlas đã load có thể tiếp tục nằm trong bộ nhớ. Ref count của asset về 0 chưa đảm bảo asset biến mất ngay. .