Menu
CoddyTech

Vì sao cần pool đối tượng

Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 46 trên 64.

Một khẩu súng bắn 10 viên đạn mỗi giây trong một phút sẽ gọi Instantiate 600 lần và Destroy 600 lần. Mỗi lần gọi Instantiate sẽ sao chép prefab cùng tất cả thành phần của nó, rồi chạy Awake, OnEnable và Start. Mỗi lần gọi Destroy sẽ chạy OnDisable và OnDestroy, đồng thời để lại bộ nhớ của đối tượng dưới dạng rác. Bộ thu gom rác của C# sẽ giải phóng bộ nhớ đó sau, và công việc này diễn ra ở một số khung hình nhưng không phải ở những khung hình khác, gây ra hiện tượng khựng hình, nghiêm trọng nhất trên điện thoại chậm hơn.

Pool giữ lại các đối tượng thay vì hủy chúng. Một viên đạn đã bắn sẽ được tắt bằng SetActive(false) rồi quay lại pool; phát súng tiếp theo lấy một viên ra và bật nó lên, còn Instantiate chỉ chạy khi pool đã hết đối tượng. Sau vài giây đầu tiên bắn liên tục, việc bắn không tạo thêm gì mới và cũng không để lại rác. Khi tái sử dụng, Awake và Start không chạy lại: chúng đã chạy một lần khi đối tượng được tạo. Những gì cần bắt đầu lại mỗi lần sử dụng, chẳng hạn như bộ đếm thời gian, máu hoặc vận tốc, sẽ được đặt lại trong OnEnable hoặc bằng code lấy đối tượng ra.

Pooling hữu ích với những đối tượng thường xuyên được tạo rồi bỏ đi: đạn, tia lửa, số sát thương, kẻ địch trong game theo từng đợt. Pooling không hữu ích với một con trùm chỉ xuất hiện một lần hoặc một menu thỉnh thoảng mới mở. Pool luôn giữ bộ nhớ cho các đối tượng không hoạt động, vì vậy hãy giữ lại một số lượng hợp lý và giải phóng những đối tượng dư thừa.

Tự làm thử

Bài học này không có thử thách code.

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity