Chất liệu và chương trình đổ bóng

Làm theo các phương pháp hay nhất này để tối ưu hoá việc sử dụng chất liệu và chương trình đổ bóng trong trò chơi trên Android.

Chất liệu và chương trình đổ bóng là các yếu tố cốt lõi của đồ hoạ 3D hiện đại. Các trò chơi 3D chạy tốt và phổ biến nhất chính là những trò chơi có đồ hoạ 3D được thiết kế để khai thác tối đa trình xử lý đồ hoạ. Bản hướng dẫn này nêu bật các cách tối ưu hoá cũng như các phương pháp hay nhất cho chất liệu và chương trình đổ bóng trên thiết bị di động để giúp trò chơi của bạn hoạt động hiệu quả hơn trong khi giảm thiểu được mức tiêu thụ điện năng.

Các phần trong bài viết này được dựa trên các sản phẩm do Arm Limited đóng góp và giữ bản quyền.

Chương trình đổ bóng thân thiện với công cụ phát triển trò chơi dành cho thiết bị di động

Mỗi công cụ phát triển trò chơi lại có cách riêng để liên kết chất liệu (material) với chương trình đổ bóng (shader). Công cụ Unity có thể tạo nhiều chương trình đổ bóng, nhưng mỗi chất liệu chỉ được gán với duy nhất một chương trình đổ bóng. Unreal Engine 4 có thể áp dụng nhiều chương trình đổ bóng cho một chất liệu dựa trên nền tảng mục tiêu.

Để nắm được định nghĩa chương trình đổ bóng và chất liệu, hãy xem nội dung Các phương pháp hay nhất về chất liệu và chương trình đổ bóng dành cho nghệ sĩ.

Nếu bạn đang sử dụng một công cụ phát triển trò chơi, chẳng hạn như Unity hoặc Unreal Engine 4, hãy sử dụng các chương trình đổ bóng tích hợp sẵn được thiết kế cho phần cứng di động. Các chương trình đổ bóng này triển khai các tính năng được đơn giản hoá để đạt được hiệu suất cao hơn trên thiết bị di động. Nếu có thể, hãy tắt các tính năng bạn không dùng đến khi định cấu hình chất liệu. Đó có thể là những tính năng như phủ màu (color tinting) hoặc bản đồ chi tiết (detail map). Khi bạn tắt các tính năng không dùng đến, công cụ có thể loại bỏ những tính năng đó khỏi chương trình đổ bóng cuối cùng, nhờ đó mang lại hiệu suất cao hơn.

Unity

Unity bao gồm nhiều công cụ kết xuất. Đối với các trò chơi hiện đại dành cho thiết bị di động, lựa chọn tốt nhất là Quy trình kết xuất chung (Universal Render Pipeline – URP). URP bao gồm một tập hợp tiêu chuẩn các chương trình đổ bóng tự động điều chỉnh độ phức tạp tuỳ thuộc vào nền tảng mục tiêu. Trình kết xuất Unity cũ bao gồm một tập hợp các trình đổ bóng được thiết kế cho các nền tảng trên thiết bị di động. Các chương trình đổ bóng này được nhóm trong danh mục Mobile (Thiết bị di động).

Unreal Engine 4

Công cụ Unreal sẽ chọn một chương trình đổ bóng cho thiết bị di động dựa trên nền tảng mục tiêu đã chọn. Hình ảnh đầu ra từ chương trình đổ bóng cho thiết bị di động có thể khác với chương trình đổ bóng mặc định của Shader Model 5. Bạn có thể thay đổi Preview Rendering Level (Mức độ kết xuất bản xem trước) trong trình chỉnh sửa Unreal để mô phỏng kết quả kết xuất của chương trình đổ bóng cho thiết bị di động. Mặc dù có một số điểm khác biệt, Unreal sử dụng quy trình như nhau cho các chất liệu trên mọi nền tảng, vì vậy, chương trình đổ bóng cho thiết bị di động nhìn chung sẽ có hình ảnh và hành vi tương tự như các chương trình đổ bóng mặc định.

Thiết lập chế độ kết xuất bản xem trước cho thiết bị di động trong trình chỉnh sửa Unreal
Hình 1. Thiết lập chế độ kết xuất bản xem trước cho thiết bị di động trong trình chỉnh sửa Unreal.

Giảm thiểu việc lấy mẫu kết cấu

Các trò chơi nhắm đến thiết bị di động nên sử dụng ít kết cấu nhất có thể trong chất liệu. Mỗi kết cấu được thêm vào lại yêu cầu phải lấy thêm mẫu kết cấu, việc này tiêu tốn băng thông bộ nhớ và tăng mức tiêu thụ điện năng. Unreal Engine 4 đề xuất sử dụng tối đa 5 kết cấu chất liệu khi chạy trên thiết bị di động. Thậm chí, 5 mẫu kết cấu cũng có thể gây tốn kém khi sử dụng rộng rãi trên nhiều thiết bị. Có một số chiến lược để giảm thiểu số lượng mẫu kết cấu như sau:

  • Sử dụng tính năng đóng gói kết cấu để kết hợp các kết cấu đơn kênh. Để biết thêm thông tin về kỹ thuật này, hãy xem hướng dẫn về Kết cấu.
  • Thay thế dữ liệu cho các thông số như độ nhám hoặc kim loại bằng một hằng số thay vì đọc từ một kết cấu.
  • Sử dụng chương trình đổ bóng không chiếu sáng hoặc một mô hình chiếu sáng đơn giản để có thể bỏ qua các kết cấu cần thiết nhằm hỗ trợ việc tính toán hoạt động chiếu sáng trong các mô hình chiếu sáng phức tạp hơn.

Tắt chế độ chiếu sáng khi có thể

Chiếu sáng hoặc không chiếu sáng, đây là cách phân chia phổ biến cho chương trình đổ bóng và chất liệu. Chế độ chiếu sáng theo thời gian thực đòi hỏi việc tính toán bổ sung trong chương trình đổ bóng. Tuỳ thuộc vào loại hệ thống chiếu sáng đang được triển khai, có thể bạn sẽ cần đến kết cấu chất liệu (dùng nhiều bộ nhớ và băng thông hơn). Đối với trò chơi dành cho thiết bị di động, đặc biệt là những trò chơi nhắm đến phần cứng không mạnh, việc giảm thiểu hoạt động chiếu sáng theo thời gian thực là rất quan trọng để đạt được hiệu suất tối ưu. Bạn nên cân nhắc việc định hướng nghệ thuật xoay quanh những thiết kế hiệu quả mà không cần chiếu sáng theo thời gian thực, chẳng hạn như nghệ thuật cách điệu hoặc có tính hoạt hình.

So sánh một mô hình kết xuất khi có và không có chiếu sáng
Hình 2. Ví dụ về một mô hình được kết xuất có ánh sáng theo thời gian thực (bên trái) và không có ánh sáng theo thời gian thực (bên phải).

Giảm thiểu việc sử dụng yếu tố trong suốt

Hãy sử dụng chất liệu không trong suốt mỗi khi có thể. Kết xuất một đối tượng trong suốt luôn tốn kém hơn kết xuất một đối tương đương nhưng không trong suốt. Việc kết xuất yếu tố trong suốt trên phần cứng đồ hoạ trên thiết bị di động tốn kém hơn rất nhiều so với khi kết xuất trên phần cứng máy tính hoặc phần cứng đồ hoạ trong máy chơi trò chơi. Việc vẽ nhiều đối tượng trong suốt trong trò chơi, đặc biệt là khi kết xuất chồng lên nhau, sẽ tác động tiêu cực đến hiệu suất.

Vẽ nhiều lần cùng một pixel là một vấn đề được gọi là overdraw (vẽ nhiều lần). Nên tránh tình trạng vẽ nhiều lần một vật thể trong suốt. Nhiều trò chơi có các công cụ chẩn đoán để trực quan hoá tình trạng vẽ nhiều lần nhằm giúp phát hiện và loại bỏ vấn đề này. Hãy sử dụng các công cụ như vậy để cải thiện hiệu suất của trò chơi và xác định vấn đề làm giảm tốc độ khung hình.

Ví dụ về công cụ trực quan hoá tình trạng vẽ nhiều lần trong trình chỉnh sửa Unity
Hình 3. Ví dụ về công cụ trực quan hoá tình trạng vẽ nhiều lần trong trình chỉnh sửa Unity.
Ví dụ về công cụ trực quan hoá tình trạng vẽ nhiều lần trong trình chỉnh sửa Unreal
Hình 4. Ví dụ về công cụ trực quan hoá tình trạng vẽ nhiều lần trong trình chỉnh sửa Unreal.

Sử dụng phương thức alpha phù hợp

Phối alpha (alpha blending) và thử nghiệm alpha (alpha testing) là hai phương pháp phổ biến nhất để triển khai đối tượng trong suốt.

Thử nghiệm alpha sẽ làm cho chất liệu của đối tượng có độ mờ (opaque) 100% hoặc trong suốt (transparent) 100%. Bạn có thể định cấu hình ngưỡng giá trị alpha cho điểm ngắt này. Trong Unity, loại trong suốt này được gọi là Cutout (Cắt bỏ). Trong Unreal Engine 4, nó được gọi là chế độ phối Masked (Che phủ).

Chế độ phối alpha mang đến một mức độ trong suốt nào đó cho vật thể và có thể làm cho vật thể trở lên trong suốt một phần. Unity gọi loại trong suốt này là Transparent (Trong suốt). Trong Unreal Engine 4, nó được gọi là chế độ phối Translucent (Trong mờ).

So sánh giữa phối alpha và thử nghiệm alpha
Hình 5. Hình ảnh ví dụ (bên trái) kết xuất bằng cách sử dụng phối alpha (ở giữa) và thử nghiệm alpha (bên phải).

Nhìn chung, phối alpha sẽ cho ra hình ảnh vượt trội hơn so với thử nghiệm alpha. Tuy nhiên, đối với một số loại lưới, chẳng hạn như tán lá, chế độ phối alpha có thể trông khác thường khi lưới nhìn vào chuyển động. Việc này là do cảm nhận về lá và cành được kết xuất không đúng thứ tự. Thử nghiệm alpha sẽ giảm thiểu tác động này, đổi lại là bị tăng răng cưa (aliasing) và cạnh sắc trên lá và cành.

Thời gian kết xuất cùng một lưới có thể khác nhau giữa hai chế độ phối alpha và thử nghiệm alpha. Đối với những lưới mà một trong hai chế độ có thể mang lại hình ảnh đầu ra chấp nhận được, bạn nên đo điểm chuẩn để xem có phương thức nào hiệu quả hơn không.

Phân tích độ phức tạp của chương trình đổ bóng

Các tính năng kết xuất như lấy mẫu kết cấu, chiếu sáng và trong suốt đều làm tăng độ phức tạp của chương trình đổ bóng và làm giảm hiệu suất kết xuất. Bạn có thể dùng các công cụ tích hợp trong công cụ phát triển trò chơi cũng như các công cụ đồ hoạ bên ngoài để đánh giá độ phức tạp của chương trình đổ bóng của bạn.

Unreal Engine 4 có chế độ xem Shader Complexity (Độ phức tạp của chương trình đổ bóng) đưa ra ước tính chi phí cho các đối tượng trong cảnh của bạn.

Chế độ xem Shader Complexity (Độ phức tạp của chương trình đổ bóng) trong trình chỉnh sửa Unreal
Hình 6. Chế độ xem Shader Phức tạp trong trình chỉnh sửa Unreal.

Bạn cũng có thể sử dụng tính năng Material Stats (Thống kê về chất liệu) của Unreal để phân tích chi phí của chất liệu trong quá trình bạn sáng tác.

Màn hình Material Stats (Thống kê về chất liệu) trong trình chỉnh sửa Unreal
Hình 7. Màn hình Material Stats (Thống kê về chất liệu) trong trình chỉnh sửa Unreal.

Tính toán trong chương trình đổ bóng đỉnh chóp (vertex)

Thương thì các phép tính toán chương trình đổ bóng kết xuất được chia làm hai loại là chương trình đổ bóng đỉnh chóp (vertex shader) và chương trình đổ bóng phân mảnh (fragment shader, mảnh ở đây còn được gọi là pixel). Số lượng phân mảnh được kết xuất thường lớn hơn số lượng đỉnh chóp. Nếu có thể thực hiện một phép tính toán tốn kém trong chương trình đổ bóng đỉnh chóp thì việc này xảy ra ít thường xuyên hơn so với trong trình đổ bóng phân mảnh

Tuy nhiên, nếu dữ liệu này được trình đổ bóng phân mảnh tiêu thụ, thì dữ liệu này phải được truyền sang từ chương trình đổ bóng đỉnh chóp. Nếu số lượng dữ liệu đang được chuyển quá lớn, thì có thể việc thực hiện tính toán trong chương trình đổ bóng phân mảnh sẽ có hiệu suất cao hơn. Bạn có thể sử dụng các công cụ phân tích hiệu suất (profiling tool) để đánh giá khả năng tận dụng ô xếp (tiler utilization) nhằm xác định vị trí chương trình đổ bóng tối ưu cho một tập hợp phép tính. Unreal Engine 4 có tính năng Custom UVs (UV tuỳ chỉnh) có thể hỗ trợ việc phân tích tài nguyên này.

Tránh các phép toán tốn kém

Các phép toán được sử dụng trong các chương trình đổ bóng để kiểm soát hành vi và giao diện của sản phẩm đầu ra của chương trình đổ bóng. Có thể kể đến một số phép toán phổ biến như các phép tính số học cơ bản, luỹ thừa, sàn, lôgarit, v.v. Các phép toán không bằng chi phí tính toán. Chương trình đổ bóng có nhiều phép toán tốn kém sẽ hoạt động chậm hơn, đặc biệt là trên các thiết bị cũ. Ví dụ về một số phép toán tương đối rẻ:

  • Phép cộng
  • Phép trừ
  • Phép nhân

Các phép toán đắt tiền hơn gồm có:

  • Phép chia
  • Phương trình siêu việt (sin, cos, luỹ thừa, log, tan)

Thường xuyên phân tích hiệu suất

Không phải lúc nào bạn cũng thấy rõ nút thắt cổ chai trong hiệu suất của mình. Hãy tránh việc suy đoán nơi gặp vấn đề và dùng các công cụ phân tích hiệu suất (profiling tool) để đánh giá hiệu suất kết xuất. Hãy nhớ thực hiện trước và sau các thử nghiệm với giá trị tối ưu bất kỳ để có thể đo đúng mức độ tác động.