Hero image

Mẹo tối ưu hóa cho thiết bị di động dành cho các nghệ sĩ kỹ thuật Phần II

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 gì bạn sẽ nhận được từ trang này: Phần II trong bộ sưu tập các mẹo hữu ích của chúng tôi. Để tối ưu hóa tài nguyên đồ họa cho trò chơi di động của bạn. Phần I là đây .

Bạn có thể tìm thấy nhiều mẹo tối ưu hóa cho thiết bị di động khác trong cuốn sách điện tử toàn diện này và khóa học Unity Learn về Tối ưu hóa đồ họa 3D cho ứng dụng di động .

Cài đặt ánh sáng trên trình chỉnh sửa Unity

SẮP XẾP CÁC ĐỐI TƯỢNG TRONG TRÒ CHƠI CỦA BẠN ĐỂ TẬN DỤNG TỐT CÁC KỸ THUẬT XẾP HÀNG LOẠT NÀY.

Ánh sáng

Hệ thống chiếu sáng và vật liệu dựa trên vật lý tương tự như trên máy chơi game và PC cũng có thể được mở rộng quy mô cho điện thoại hoặc máy tính bảng của bạn nhờ Universal Render Pipeline (URP).

Gom các lệnh vẽ lại với nhau.

Với mỗi khung hình, Unity xác định các đối tượng cần được hiển thị, sau đó tạo ra các lệnh vẽ. Lệnh vẽ (draw call) là lệnh gọi đến API đồ họa để vẽ các đối tượng (ví dụ: một hình tam giác), trong khi một lô lệnh (batch) là một nhóm các lệnh vẽ được thực thi cùng nhau. Việc nhóm các đối tượng cần vẽ lại với nhau giúp giảm thiểu sự thay đổi trạng thái cần thiết để vẽ từng đối tượng trong nhóm. Điều này giúp cải thiện hiệu năng bằng cách giảm chi phí CPU khi hiển thị các đối tượng.

  • Phân nhóm động: Đối với các lưới nhỏ, Unity có thể nhóm và biến đổi các đỉnh trên CPU, sau đó vẽ tất cả chúng cùng một lúc. Ghi chú: Chỉ sử dụng phương pháp này nếu bạn có đủ lưới đa giác thấp (ít hơn 900 thuộc tính đỉnh và không quá 300 đỉnh). Công cụ Dynamic Batcher sẽ không xử lý các lưới lớn hơn kích thước này, vì vậy việc bật nó sẽ lãng phí thời gian CPU để tìm kiếm các lưới nhỏ để xử lý trong mỗi khung hình.
  • Xử lý theo lô tĩnh: Đối với hình học không chuyển động, Unity có thể giảm số lượng lệnh vẽ cho các lưới có cùng chất liệu. Mặc dù hiệu quả hơn so với xử lý theo lô động, phương pháp này lại tiêu tốn nhiều bộ nhớ hơn.
  • Tạo phiên bản GPU: Nếu bạn có một số lượng lớn các đối tượng giống hệt nhau, kỹ thuật này sẽ nhóm chúng lại hiệu quả hơn thông qua việc sử dụng phần cứng đồ họa.

Phân lô SRP : Kích hoạt SRP Batcher trong tài nguyên URP của bạn ở mục Nâng cao. Điều này có thể giúp tăng tốc đáng kể thời gian xử lý đồ họa của CPU, tùy thuộc vào cảnh quay.

Tránh sử dụng quá nhiều đèn động.

Điều quan trọng là phải tránh thêm quá nhiều hiệu ứng ánh sáng động vào ứng dụng di động của bạn. Hãy xem xét các giải pháp thay thế như hiệu ứng đổ bóng tùy chỉnh và dò ánh sáng cho lưới động, cũng như ánh sáng được tính toán sẵn cho lưới tĩnh.

Xem bảng so sánh tính năng này để biết các giới hạn cụ thể của đèn chiếu sáng thời gian thực URP và Built-In Render Pipeline.

Tắt bóng đổ

Bạn có thể tắt tính năng đổ bóng cho từng MeshRenderer và nguồn sáng riêng biệt. Hãy tắt hiệu ứng đổ bóng bất cứ khi nào có thể để giảm số lượng lệnh vẽ.

Bạn cũng có thể tạo bóng giả bằng cách sử dụng kết cấu mờ được áp dụng cho một lưới đơn giản hoặc hình tứ giác nằm bên dưới nhân vật của bạn. Ngoài ra, bạn có thể tạo bóng đổ dạng khối bằng các shader tùy chỉnh.

Sơ đồ Lightmap Unity

TẮT CHỨC NĂNG TẠO BÓNG ĐỂ GIẢM SỐ LƯỢNG LỆNH VẼ.

Tích hợp ánh sáng vào bản đồ ánh sáng.

Thêm hiệu ứng ánh sáng ấn tượng cho hình học tĩnh của bạn bằng cách sử dụng Chiếu sáng toàn cục (GI) . Đánh dấu các đối tượng bằng Contribute GI để bạn có thể lưu trữ ánh sáng chất lượng cao dưới dạng bản đồ ánh sáng.

Nhờ đó, bóng đổ và ánh sáng được tính toán trước có thể được hiển thị mà không ảnh hưởng đến hiệu năng khi chạy chương trình. Công cụ Progressive CPU và GPU Lightmapper có thể tăng tốc quá trình xử lý chiếu sáng toàn cục (Global Illumination).

Hãy làm theo hướng dẫn và bài viết này về tối ưu hóa ánh sáng để bắt đầu sử dụng lightmapping trong Unity.

Nhiều lớp ánh sáng trong trình chỉnh sửa Unity

CÁC LỚP CÓ THỂ GIỚI HẠN ẢNH HƯỞNG CỦA ÁNH SÁNG VÀO MỘT MẶT NẠ LỌC CỤ THỂ.

Hãy mặc nhiều lớp quần áo mỏng.

Đối với các cảnh phức tạp có nhiều nguồn sáng, hãy tách các đối tượng bằng cách sử dụng các lớp, sau đó giới hạn phạm vi ảnh hưởng của mỗi nguồn sáng vào một mặt nạ loại bỏ cụ thể.

Các đầu dò ánh sáng trong trình chỉnh sửa Unity

Sử dụng đầu dò ánh sáng để quan sát các vật thể chuyển động.

Light Probes lưu trữ thông tin chiếu sáng đã được tính toán về không gian trống trong cảnh của bạn, đồng thời cung cấp ánh sáng chất lượng cao (cả trực tiếp và gián tiếp). Chúng sử dụng các hàm điều hòa cầu, có tốc độ tính toán nhanh hơn so với ánh sáng động.

Hình cầu phản chiếu giao cắt với hình lập phương

Giảm thiểu đầu dò phản xạ

Một thiết bị dò phản xạ có thể tạo hình ảnh phản chiếu chân thực, nhưng chi phí sản xuất theo lô có thể rất cao. Sử dụng cubemap độ phân giải thấp, mặt nạ loại bỏ và nén текстура để cải thiện hiệu suất thời gian chạy.

Vật liệu trong suốt trong Unity Editor

CHẾ ĐỘ HIỂN THỊ VẼ TRÊN TRONG CHẾ ĐỘ XEM CẢNH

Hãy cẩn thận với các vật liệu trong suốt.

Việc hiển thị một đối tượng trong suốt luôn tiêu tốn nhiều tài nguyên GPU hơn so với việc hiển thị một đối tượng mờ đục, đặc biệt là khi các đối tượng trong suốt được hiển thị chồng lên nhau nhiều lần, một quá trình được gọi là vẽ chồng (overdraw). Nên sử dụng chất liệu mờ đục bất cứ khi nào có thể, đặc biệt là đối với các nền tảng di động. Bạn có thể kiểm tra hiện tượng vẽ chồng lên nhau bằng trình gỡ lỗi đồ họa RenderDoc .

Hãy giữ cho các shader đơn giản.

Hãy sử dụng shader đơn giản nhất có thể (chẳng hạn như shader không chiếu sáng) và tránh sử dụng các tính năng không cần thiết. Hãy sử dụng các shader được tích hợp sẵn của Unity, được thiết kế đặc biệt cho các hệ thống như hiệu ứng hạt. URP bao gồm một số shader Lit và Unlit nhẹ đã được tối ưu hóa cho nền tảng di động. Để giảm thiểu hiện tượng vẽ chồng lên nhau, hãy giảm số lượng và/hoặc kích thước các hạt trong trò chơi của bạn.

Để đạt được mục tiêu hiệu năng, hãy cân nhắc sử dụng vật liệu Unlit Opaque với độ chính xác một nửa khi có thể, và lưu ý đến các thao tác phức tạp trong các nút. Hãy tìm hiểu thêm các mẹo hữu ích trong phần này về Shader Graph.

Văn chương so với... Shader không được chiếu sáng

Khi tạo shader, bạn có thể quyết định cách vật liệu sẽ phản ứng với ánh sáng. Hầu hết các shader được phân loại là có ánh sáng hoặc không có ánh sáng. Shader không chiếu sáng là mô hình đổ bóng nhanh nhất và tiết kiệm chi phí tính toán nhất. Hãy sử dụng nó nếu bạn đang nhắm đến một thiết bị thuộc phân khúc thấp hơn.

Những điểm quan trọng cần xem xét bao gồm:

  • Ánh sáng không ảnh hưởng đến mô hình đổ bóng không được chiếu sáng. Điều này có nghĩa là nhiều phép tính, chẳng hạn như phép tính độ phản xạ, không cần thiết. Kết quả là quá trình kết xuất sẽ rẻ hơn hoặc nhanh hơn.
  • Việc sử dụng phong cách nghệ thuật cách điệu giống như phim hoạt hình rất hiệu quả với kỹ thuật tô bóng không dùng ánh sáng. Phong cách này rất đáng để cân nhắc khi bạn phát triển game cho nền tảng di động.
Đồ thị đổ bóng trong trình chỉnh sửa Unity

DỊCH CHUYỂN ĐỈNH TRONG ĐỒ THỊ SHADER

Các phép toán trong shader đỉnh

Shader đỉnh xử lý trên mọi đỉnh, trong khi shader pixel (hoặc shader mảnh) xử lý trên mọi pixel. Thông thường, số lượng pixel được hiển thị nhiều hơn số lượng đỉnh trên màn hình. Điều này có nghĩa là bộ xử lý pixel được thực thi thường xuyên hơn bộ xử lý đỉnh. Do đó, chúng tôi khuyên bạn nên chuyển quá trình tính toán từ shader pixel sang shader đỉnh bất cứ khi nào có thể. Như thường lệ, sau khi thực hiện các tối ưu hóa, bạn cần tiến hành phân tích hiệu năng sâu hơn để xác định giải pháp tốt nhất cho tình huống cụ thể của mình.

Các phép toán cơ bản, như cộng và nhân, được xử lý nhanh hơn. Tốt nhất là nên giữ số lượng các phép toán chậm ở mức càng ít càng tốt. Lượng phép toán phức tạp được sử dụng phải được giảm thiểu trên các thiết bị cũ hơn, chẳng hạn như các thiết bị sử dụng GLES 2.0.

Máy trộn SRP

Khi bật SRP Batcher , hãy theo dõi cửa sổ Thống kê và Đồ thị đỉnh của Phần Kết xuất trong chế độ xem Trình phân tích hiệu năng. Ngoài việc tăng FPS, số lượng tam giác và đỉnh được xử lý giảm đi đáng kể. Vì các đối tượng của chúng tôi sử dụng shader tương thích với URP, nên quy trình kết xuất tự động nhóm tất cả dữ liệu hình học liên quan lại với nhau để giảm lượng dữ liệu cần xử lý.

Hoạt hình nhân vật

Theo mặc định, Unity nhập các mô hình hoạt hình với Generic Rig, mặc dù các nhà phát triển thường chuyển sang Humanoid Rig khi tạo hoạt ảnh cho nhân vật. Hệ thống điều khiển chuyển động hình người (Humanoid Rig) tiêu tốn nhiều thời gian xử lý CPU hơn 30–50% so với hệ thống điều khiển chuyển động thông thường tương đương vì nó tính toán IK và điều chỉnh lại mục tiêu hoạt ảnh cho mỗi khung hình.

Việc kết xuất các mô hình lưới có da rất tốn kém. Hãy đảm bảo rằng mọi đối tượng sử dụng SkinnedMeshRenderer đều yêu cầu điều đó. Nếu một GameObject chỉ cần hoạt ảnh trong một số thời điểm nhất định, hãy sử dụng hàm BakeMesh để đóng băng lưới đã được tạo khung xương ở một tư thế tĩnh, sau đó chuyển sang MeshRenderer đơn giản hơn trong quá trình chạy.

Hệ thống Mecanim của Unity, chủ yếu dành cho các nhân vật hình người, khá phức tạp nhưng thường được sử dụng để tạo hiệu ứng chuyển động cho các giá trị đơn lẻ (ví dụ: kênh alpha của một phần tử giao diện người dùng). Tránh lạm dụng Animators. Đặc biệt khi kết hợp với các yếu tố giao diện người dùng, hãy cân nhắc tạo các hàm chuyển động mượt mà hoặc sử dụng thư viện bên thứ ba để tạo hoạt ảnh đơn giản (ví dụ: DOTween hoặc LeanTween).

Cảnh chiếu sáng nội thất trong Unity Editor

KIỂM TRA CÁC LỆNH VẼ, QUÁ TRÌNH XỬ LÝ THEO LÔ VÀ MỌI BƯỚC CỦA CHU TRÌNH HIỂN THỊ BẰNG CÔNG CỤ GỠ LỖI KHUNG HÌNH

Thêm mẹo

Làm việc theo một ngân sách thời gian cụ thể cho mỗi khung hình.

Mỗi khung hình sẽ có một khoảng thời gian giới hạn dựa trên số khung hình mục tiêu mỗi giây (fps) mà bạn mong muốn. Lý tưởng nhất, một ứng dụng chạy ở tốc độ 30 khung hình/giây sẽ cho phép thời gian xử lý xấp xỉ 33,33 ms mỗi khung hình (1000 ms / 30 khung hình/giây). Tương tự, mục tiêu 60 khung hình/giây sẽ tương ứng với 16,66 ms mỗi khung hình.

Các thiết bị có thể vượt quá giới hạn này trong thời gian ngắn (ví dụ: đối với các đoạn phim cắt cảnh hoặc trình tự tải), nhưng không được vượt quá trong thời gian dài.

Cài đặt sẵn

Đừng chỉ dựa vào cài đặt mặc định. Sử dụng tab ghi đè dành riêng cho nền tảng để tối ưu hóa các tài nguyên như kết cấu và hình học lưới. Cài đặt không chính xác có thể dẫn đến kích thước bản dựng lớn hơn, thời gian biên dịch lâu hơn và sử dụng bộ nhớ kém hiệu quả. Hãy cân nhắc sử dụng tính năng Cài đặt sẵn để tùy chỉnh các thiết lập cơ bản nhằm nâng cao chất lượng của một dự án cụ thể.

Hạn chế sử dụng máy ảnh

Mỗi camera đều tiêu tốn một số chi phí vận hành, bất kể nó có thực hiện công việc có ý nghĩa hay không. Chỉ sử dụng các thành phần Camera cần thiết cho quá trình hiển thị. Trên các nền tảng di động cấp thấp, mỗi camera có thể sử dụng tối đa 1 ms thời gian xử lý của CPU.

Tránh các hiệu ứng toàn màn hình

Các hiệu ứng xử lý hậu kỳ ở chế độ toàn màn hình, chẳng hạn như hiệu ứng phát sáng, có thể làm giảm hiệu năng đáng kể. Hãy sử dụng chúng một cách thận trọng trong khâu thiết kế đồ họa cho tiêu đề của bạn.

Hãy cẩn thận với Renderer.material

Việc truy cập Renderer.material trong các script sẽ sao chép vật liệu và trả về tham chiếu đến bản sao mới. Thao tác này sẽ làm hỏng bất kỳ lô hàng hiện có nào đã bao gồm nguyên liệu đó. Nếu bạn muốn truy cập vật liệu của đối tượng được nhóm lại, hãy sử dụng Renderer.sharedMaterial thay thế.