Hero image

Tối ưu hóa hiệu năng của game 2D với Unity Tilemap

Nhận các mẹo để cải thiện hiệu suất trò chơi 2D và ứng dụng di động của bạn với Unity Tilemap. Các chủ đề được đề cập ở đây bao gồm kích thước cảnh, tuần tự hóa, chi phí xử lý của trình kết xuất và xử lý theo lô.

Trang web này đã được dịch bằng máy để thuận tiện cho bạn. Chúng tôi không thể đảm bảo tính chính xác hoặc độ tin cậy của nội dung được dịch. Nếu bạn có thắc mắc về tính chính xác của nội dung được dịch, vui lòng tham khảo phiên bản tiếng Anh chính thức của trang web.

Những lời khuyên này hữu ích nhất cho những người dùng đã có kinh nghiệm sử dụng bộ công cụ 2D của Unity. Một nguồn tài liệu tuyệt vời khác dành cho các nhà sáng tạo chuyên nghiệp phát triển game 2D thương mại bằng Unity là sách điện tử của chúng tôi, "Nghệ thuật, ánh sáng và hoạt hình game 2D " .

Nếu bạn mới bắt đầu phát triển game 2D với Unity, hãy tham khảo hướng dẫn 2D dành cho người dùng mới .

Ảnh chụp màn hình trình chỉnh sửa Unity

MỘT HÌNH ẢNH TỪ DỰ ÁN UNITY 2D LOST CRYPT

Mẹo chung về hiệu suất

Dưới đây là một vài lời khuyên chung về hiệu suất cần xem xét:

  • Hãy suy nghĩ về hiệu suất của tài sản (dữ liệu) của bạn ngay từ đầu. Nếu những yếu tố này không ảnh hưởng đến hiệu suất, bạn sẽ khó có thể tối ưu hóa mã của mình sau này.
  • Lập hồ sơ trên thiết bị mục tiêu cấu hình thấp nhất hiện có của bạn. Hãy sử dụng Unity Profiler trong suốt quá trình phát triển dự án của bạn, cùng với các công cụ phân tích hiệu năng dành riêng cho từng nền tảng, chẳng hạn như Xcode cho thiết bị iOS.
  • Không nên sử dụng quá một phần ba dung lượng RAM khả dụng trên thiết bị cấu hình thấp nhất của bạn. Điều này đảm bảo nội dung của bạn sẽ hiển thị tốt trên nhiều loại thiết bị di động (điện thoại Android giá rẻ vẫn là loại phổ biến nhất trên thị trường di động).

Để biết thêm các mẹo tối ưu hóa 2D , hãy xem các nguồn tài liệu sau:

Unity - Tạo màn chơi 2D nhanh chóng với Tilemap

VÍ DỤ VỀ BẢN ĐỒ Ô

Giới thiệu ngắn gọn về Tilemap

Thành phần Tilemap cho phép bạn tạo các cấp độ 2D một cách hiệu quả bằng cách sử dụng các ô trên một lớp phủ lưới. Nó bao gồm một số yếu tố, trong đó có:

Bạn có thể tạo các màn chơi 2D bằng cách kết hợp Sprite và GameObjects, và điều khiển các thuộc tính như Lớp sắp xếp, Va chạm bản đồ ô và Ô hoạt hình, cùng nhiều thuộc tính khác. Bạn cũng có thể tô màu các hình vuông , hình lục giáchình chiếu đẳng cự .

Hãy tô màu các màn chơi của bạn bằng Tilemap, để thành phần Tilemap Collider 2D sẽ tự động tạo ra một Collider xung quanh các ô (dựa trên cài đặt Collider Type của ô) khi được áp dụng cho một GameObject Tilemap.

Hãy cùng xem xét những lợi ích về hiệu năng mà bạn nhận được khi sử dụng Tilemap so với các cảnh được xây dựng bằng Sprites.

Bản đồ ô với ít đối tượng hơn

BẢN ĐỒ ỐP TRONG BẢN DEMO UNITY 2D DRAGON CRASHERS

Số lượng GameObjects ít hơn

Việc sử dụng Tilemap giúp giảm thời gian tải, cũng như tiết kiệm bộ nhớ và CPU.

Nếu bạn đã từng phát triển game và ứng dụng 2D trước đây, thì bạn biết rằng bạn có thể sẽ có rất nhiều Sprite trong game của mình, tất cả chúng đều là GameObjects riêng biệt. Mỗi đối tượng Sprite GameObjects đều có các thành phần, bao gồm Transform và Renderer, tất cả đều chiếm bộ nhớ. Các thành phần khác, chẳng hạn như Collider, sẽ tiêu tốn tài nguyên CPU.

Ngược lại, Tilemap sử dụng một Renderer duy nhất cho toàn bộ bản đồ và tất cả các ô của nó. Điều này giúp giảm chi phí vận hành vì nó chỉ xử lý các cấu trúc dữ liệu của riêng mình, so với việc có nhiều cấu trúc dữ liệu khác nhau trong bộ nhớ.

Việc có ít GameObjects hơn sẽ tạo ra một cấu trúc phân cấp gọn gàng hơn, có nghĩa là bạn sẽ không phải cuộn qua một danh sách phức tạp để tìm thứ mình cần.

Unity - Giảm kích thước khung cảnh với Tilemap

SO SÁNH HAI TẬP TIN ĐƯỢC LƯU TRỮ LIÊN TIẾP, MỘT TẬP ĐƯỢC TẠO BẰNG CÁCH SPRITE (BÊN TRÁI) VÀ TẬP CÒN LẠI SỬ DỤNG BẢN ĐỒ ỐNG (BÊN PHẢI)

Kích thước cảnh nhỏ hơn

Unity Tilemap giúp giảm kích thước khung cảnh. Việc có ít GameObjects và components hơn đồng nghĩa với việc có ít đối tượng cần tải từ đĩa, giải mã và lưu trữ trong bộ nhớ trong quá trình chạy.

Việc tải các cảnh trong Unity là một quy trình gồm hai bước: Đầu tiên, dữ liệu được đọc từ đĩa. Đây là quá trình thường chiếm nhiều thời gian nhất trong trò chơi của bạn, đặc biệt là trên các thiết bị Android . Sau đó, dữ liệu được giải mã. Giải mã dữ liệu (deserialization) là quá trình chuyển đổi dữ liệu từ định dạng này sang định dạng khác. Về cơ bản, nó khôi phục dữ liệu và đối tượng từ trạng thái đã lưu. Unity thực hiện việc tuần tự hóa nội bộ, vì vậy bất cứ khi nào nó tải một tệp cảnh trong Trình chỉnh sửa và trong quá trình chạy, nó sẽ lấy các tệp đã lưu đó và chuyển đổi chúng thành các đối tượng Unity .

Trong hình ảnh trên, bạn có thể thấy sự so sánh giữa hai tập tin cảnh được tuần tự hóa, một tập tin sử dụng Tilemaps và một tập tin được tái tạo bằng Sprites. Cảm ơn Pixel Reign đã cung cấp cảnh này từ trò chơi Robbie Swifthand của họ.

Bên phải là một phần của Tilemap được lưu trữ dưới dạng chuỗi, bao gồm bốn ô. Các quy tắc cho tất cả các ô, bao gồm cả loại ô được sử dụng, được thiết lập ở đầu bản đồ ô. Mỗi ô tiếp theo đều thể hiện các thuộc tính như loại ô được sử dụng và vị trí của nó.

Bên trái là một Sprite, với các thành phần Transform và Sprite Renderer.

Từ sự so sánh này, có thể thấy rõ ràng quá trình tuần tự hóa Sprite phải thực hiện bao nhiêu công việc. Cụ thể, cảnh sử dụng Sprites có 370.000 dòng trong tệp tin, trong khi cảnh sử dụng Tilemaps chỉ có 30.000 dòng. Kích thước dự án và kho lưu trữ nhỏ hơn giúp rút ngắn thời gian lặp lại và tạo ra quy trình làm việc mượt mà hơn.

Nếu bạn muốn xem các cảnh của mình dưới dạng tệp văn bản, hãy vào cài đặt Trình chỉnh sửa , bật chế độ Serialization tài sản , nhấp vào Buộc văn bản và mở tệp cảnh .unity trong Trình chỉnh sửa văn bản .

Unity - Ít collider hơn với Tilemap

BỘ XỬ LÝ VA CHẠM BẢN ĐỒ 2D KẾT HỢP VỚI BỘ XỬ LÝ VA CHẠM TỔNG HỢP 2D

Ít va chạm hơn

Bạn có thể kết hợp Tilemap Collider 2D với Composite Collider. Điều này không chỉ giúp giảm số lượng Collider và Sprite mà còn mang lại hiệu quả cao hơn cho quá trình sản xuất vì không cần phải xây dựng lại các hình dạng va chạm phức tạp mỗi khi bạn thực hiện thay đổi. Máy gia tốc Composite Collider sẽ giải quyết vấn đề đó.

Các trường hợp sử dụng Tilemaps

MỘT TRƯỜNG HỢP SỬ DỤNG CÁC ĐỐI TƯỢNG TRÒ CHƠI RIÊNG LẺ VỚI TRÌNH KẾT XUẤT SPRITE CỦA CHÚNG SO VỚI BẢN ĐỒ Ô VUÔNG.

Giảm chi phí xử lý đồ họa

Như đã đề cập trước đó, mỗi Sprite đều có một thành phần Sprite Renderer, và việc có nhiều renderer hơn đòi hỏi CPU phải xử lý nhiều tài nguyên hơn, bao gồm cả thời gian chuẩn bị và dọn dẹp để hiển thị. Bằng cách sử dụng Tilemaps, bạn sẽ có ít thành phần Renderer hơn, nhờ đó tiết kiệm được một phần công việc cho CPU.

Giảm chi phí loại bỏ

Việc có nhiều hơn một camera trong cảnh quay đồng nghĩa với việc sẽ có nhiều bộ xử lý đồ họa hơn. Điều này làm tăng chi phí loại bỏ.

Trong chế độ xem Camera, việc loại bỏ các đối tượng không cần thiết sẽ phát sinh chi phí cho mỗi trình kết xuất và mỗi camera. Mỗi camera đều phải thực hiện kiểm tra loại bỏ các đối tượng không cần thiết trên mọi thành phần Renderer trong cảnh, vì vậy nếu bạn có thiết lập nhiều camera cho trò chơi của mình, việc sử dụng Tilemaps sẽ giúp bạn giảm chi phí đó.

ít cuộc gọi theo lô hơn

TRÌNH GỠ LỖI KHUNG

Số lượng cuộc gọi theo lô ít hơn.

Xử lý theo lô là việc thu thập tất cả các hình học có thể vẽ được mà không cần thực hiện thêm lệnh SetPass nào khác. Trình kết xuất bản đồ ô (Tilemap Renderer) nhóm các hình học của Sprite dựa trên vị trí của chúng. Kết quả là, trình kết xuất Tilemap gửi ít lưới hơn nhưng có nhiều hình học hơn đến quy trình kết xuất, so với trình kết xuất Sprite gửi nhiều lưới hơn nhưng có ít hình học hơn. Như bảng ở phần sau cho thấy, cảnh dựa trên Tilemap có số lượng batch ít hơn đáng kể.

Bạn có thể kiểm tra việc xử lý theo lô bằng cách xem bảng thống kê trong chế độ xem Trò chơi của mình. Bạn cũng có thể sử dụng Trình gỡ lỗi khung hình để xác định lý do tại sao các mục không được nhóm lại.

Các cảnh sử dụng bảng sprite và tilemap

Tốc độ khung hình nhanh hơn

Để đạt được 60 khung hình/giây, mỗi khung hình có thể mất tối đa 16 ms để hiển thị. Khi phân tích hiệu năng của cảnh mẫu trên một chiếc iPhone 7 đời cũ, phiên bản dựa trên Sprite có thời gian xử lý là 244 ms/khung hình, trong khi phiên bản dựa trên Tilemap chỉ mất 13 ms/khung hình.

Cuối cùng, mức sử dụng RAM lên tới 1,1 GB với cảnh dựa trên Sprite, con số này quá cao đối với các điện thoại Android cấu hình thấp. Cảnh dựa trên Tilemap chỉ sử dụng 21 MB RAM, giúp nó phù hợp để chạy trên nhiều loại thiết bị di động hơn.

Sự so sánh trên cho thấy rõ sự khác biệt về hiệu suất giữa hai cảnh.

Bản demo Sprite Atlas

SỬ DỤNG SPRITE ATLAS TRONG DRAGON CRASHERS

Đóng gói các Sprite bằng Sprite Atlas

Sprite Atlas là công cụ chỉnh sửa cho phép bạn đóng gói các Sprite của mình vào các texture để tối ưu hóa việc sử dụng bộ nhớ và các lệnh vẽ. Tạo một Sprite Atlas Asset bao gồm tất cả các sprite được sử dụng trong Tilemap của bạn để chúng có thể được nhóm lại bởi Tilemap Renderer chỉ trong một lệnh vẽ duy nhất (miễn là tất cả các Sprite đều nằm gọn trong một texture).

Thêm nguồn tài liệu dành cho nhà phát triển game 2D

Nâng cao kỹ năng 2D của bạn : Danh sách bài viết trên blog của chúng tôi cung cấp những lời khuyên hữu ích cho việc phát triển game 2D .

Nghệ thuật đồ họa, hoạt hình và ánh sáng trong game 2D dành cho họa sĩ : Cuốn sách điện tử miễn phí này cung cấp các phương pháp tốt nhất để tận dụng tối đa bộ công cụ 2D của Unity.

Tổng quan về các công cụ 2D : Hãy xem qua tổng quan hữu ích của chúng tôi về những gì Unity cung cấp cho các nhà phát triển đồ họa 2D .

Các mẫu quy trình với Tilemaps – Phần IPhần II : Tăng tính đa dạng cho trò chơi của bạn với tính năng tạo nội dung ngẫu nhiên. Các bài viết này giải thích một số thuật toán bạn có thể sử dụng với Tilemap và RuleTile.