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
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity