0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Tối Ưu FPS Với Kỹ Thuật Object Pooling Trong Unity

Đăng vào 3 ngày trước

• 4 phút đọc

Tối Ưu FPS Với Kỹ Thuật Object Pooling Trong Unity

Giới Thiệu

Trong lĩnh vực phát triển game, việc tối ưu hóa hiệu suất là rất quan trọng, đặc biệt là khi bạn làm việc với Unity. Một trong những kỹ thuật quan trọng giúp cải thiện FPS (khung hình trên giây) là Object Pooling. Trong bài viết này, tôi sẽ chia sẻ cách sử dụng kỹ thuật này để tối ưu hóa hiệu suất trong các trò chơi của bạn, cùng với các ví dụ thực tế và mã nguồn.

Vấn Đề: Tạo và Hủy Đối Tượng Liên Tục

Khi phát triển một trò chơi, bạn có thể gặp phải vấn đề khi tạo và hủy đối tượng một cách liên tục. Ví dụ, trong một trò chơi mà tôi đã phát triển, tôi có một cơ chế ném bom và bắn đạn. Các quả bom rơi từ trên xuống với khoảng thời gian cố định nhưng từ các vị trí ngẫu nhiên, và các khẩu pháo bắn đạn cũng theo khoảng thời gian cố định.

Cảnh Báo Hiệu Suất

Khi tôi thử nghiệm trò chơi trên PC, FPS đạt khoảng 200, nhưng khi chạy trên điện thoại di động, FPS giảm xuống chỉ còn 30 và thiết bị bị nóng. Nguyên nhân là do việc tạo và hủy đối tượng là những hoạt động nặng nề mà Unity phải thực hiện, gây ảnh hưởng đến hiệu suất, đặc biệt là trên thiết bị di động.

Giải Pháp: Tái Sử Dụng Thay Vì Tạo Mới

Có hai cách chính để giải quyết vấn đề này:

Phương Pháp 1: Bật/Tắt Đối Tượng

  • Thêm các đối tượng bom hoặc đạn vào cảnh và giữ chúng ở trạng thái ẩn.
  • Khi cần, đặt chúng ở vị trí chính xác, bật chúng lên và ném/bắn.
  • Khi va chạm, tắt chúng thay vì hủy.
  • Lặp lại quy trình này.

Cách này hoạt động tốt nếu bạn chỉ cần một đối tượng tại một thời điểm. Tuy nhiên, nếu bạn có nhiều bom và đạn cùng lúc, cách này sẽ không hiệu quả.

Phương Pháp 2: Object Pooling

Object Pooling là giải pháp tối ưu hơn. Chúng ta sẽ tạo một “pool” (bể) của các đối tượng ngay từ đầu và khi cần, lấy chúng từ pool. Sau khi sử dụng, trả lại chúng cho pool thay vì hủy.

Ví Dụ 1: Pooling Với Queue

  • Tạo một Queue cho loại đối tượng mà bạn muốn pool.
  • Xác định kích thước pool (tổng số đối tượng trong pool).
  • Tạo số lượng đối tượng đó khi khởi động, thiết lập chúng và thêm vào queue.
  • Khi cần, lấy một đối tượng từ queue, bật nó lên và sử dụng.
  • Khi xong, tắt nó và thêm lại vào queue.

Ví Dụ 2: Sử Dụng ObjectPool Của Unity (Unity 2021+)

Unity cung cấp lớp ObjectPool tích hợp sẵn, mạnh mẽ và linh hoạt hơn.

  • Tạo một ObjectPool cho loại đối tượng bạn muốn pool.
  • Trong Start hoặc Awake, thiết lập pool. Cung cấp các hàm callback cho:
    • Tạo một đối tượng
    • Lấy một đối tượng từ pool
    • Trả lại một đối tượng vào pool
    • Hủy một đối tượng
    • Thiết lập các tham số của pool (số lượng, kích thước tối đa, v.v.)
  • Gọi Get() khi bạn cần một đối tượng.
  • Gọi Release() khi đối tượng không còn sử dụng nữa.

Lưu Ý Về Kiểm Tra Collection

Khi tạo một ObjectPool, có tham số collectionCheck. Mặc định, nó là true.

  • Nếu true, Unity sẽ kiểm tra xem đối tượng bạn đang cố gắng trả lại đã có trong pool chưa. Nếu có, nó sẽ ném ra ngoại lệ để tránh việc trả lại nhiều lần.
  • Nếu false, Unity sẽ bỏ qua kiểm tra. Nếu bạn vô tình trả lại cùng một đối tượng hai lần, nó sẽ thêm lại mà không thông báo, có thể gây ra lỗi sau này.

Những Điều Cần Lưu Ý

  • Tạo và hủy đối tượng là những thao tác nặng. Nếu bạn có các đối tượng xuất hiện thường xuyên (đạn, bom, kẻ thù, v.v.), không nên tạo/hủy chúng mỗi lần.
  • Thay vào đó, tái sử dụng chúng với phương pháp bật/tắt hoặc pooling.
    • Đối với các trường hợp đơn giản, bật/tắt là đủ.
    • Đối với các trường hợp phức tạp hoặc xuất hiện thường xuyên, hãy sử dụng pooling (Queue hoặc ObjectPool của Unity).

Kết Luận

Sử dụng Object Pooling sẽ không làm cho logic của bạn nhanh hơn, nhưng nó sẽ ngăn chặn việc giảm FPS và làm nóng thiết bị di động. Trong trường hợp của tôi, việc sử dụng pooling đã khắc phục vấn đề hiệu suất — từ 30fps trên di động trở lại gameplay mượt mà.

FAQ

1. Object Pooling có khó triển khai không?
Không, Object Pooling là một kỹ thuật tương đối dễ triển khai và có thể áp dụng cho nhiều loại đối tượng trong game.

2. Tôi có thể sử dụng Object Pooling cho các đối tượng khác nhau không?
Có, bạn có thể tạo các pool riêng cho từng loại đối tượng để tối ưu hóa hiệu suất hơn nữa.

Tài Nguyên Tham Khảo

Hãy thử áp dụng Object Pooling trong dự án của bạn và đánh giá sự cải thiện về hiệu suất!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào