
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 I
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: Mẹo tối ưu hóa tài nguyên đồ họa, dành cho các nhà phát triển game di động làm việc trên Unity. Đây là phần đầu tiên của Hai bài viết về tối ưu hóa đồ họa cho game di động.
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 .

Tập trung vào hình bóng
Việc xử lý đa giác và đỉnh đều tốn nhiều tài nguyên tính toán trên các nền tảng di động. Hãy đặt các đa giác vào những khu vực thực sự góp phần vào chất lượng hình ảnh của ứng dụng, để bạn không lãng phí tài nguyên xử lý.
Do kích thước màn hình nhỏ trên hầu hết các thiết bị di động và vị trí của các đối tượng 3D trong ứng dụng của bạn, nhiều chi tiết tam giác nhỏ trên đối tượng 3D có thể không hiển thị rõ. Điều này có nghĩa là bạn nên tập trung vào các hình dạng và bộ phận lớn góp phần tạo nên hình dáng tổng thể của vật thể, thay vì các chi tiết nhỏ có thể không nhìn thấy được. Sử dụng họa tiết và bản đồ bề mặt để tạo chi tiết tinh tế.

Sử dụng Mức độ chi tiết (LOD)
Khi các đối tượng di chuyển ra xa, Mức độ chi tiết (LOD) có thể điều chỉnh hoặc chuyển đổi chúng để sử dụng các lưới đơn giản hơn với các vật liệu và bộ đổ bóng đơn giản hơn nhằm cải thiện hiệu suất GPU.
Thêm mẹo chuẩn bị LOD
- Hãy loại bỏ nhiều đa giác hơn ở những khu vực bằng phẳng và tránh sử dụng nhiều vùng tam giác trên các đối tượng có mức độ chi tiết (LOD) thấp hơn.
- LOD cũng có thể áp dụng cho độ phức tạp của shader. Shader và vật liệu có thể được tối ưu hóa cho các đối tượng 3D ở xa hơn. Ví dụ, bạn có thể giảm số lượng Texture mà một đối tượng sử dụng khi nó di chuyển ra xa camera.
- Việc giảm số lượng tam giác giữa mỗi cấp độ LOD xuống 50% thường mang lại hiệu quả tốt hơn.
- Kiểm tra xem LOD trông như thế nào ở các khoảng cách khác nhau so với máy ảnh.
- Cấu trúc hình học sạch sẽ là điều cần thiết cho các nhân vật và đối tượng đang biến dạng hoặc được hoạt họa.
- Đừng quá ám ảnh về việc phải có cấu trúc tôpô hoàn hảo. Người chơi hoặc người dùng cuối sẽ không nhìn thấy khung dây của mô hình 3D sau khi bạn đã áp dụng kết cấu và vật liệu.
Khi nào không nên sử dụng LOD
LOD không phù hợp trong mọi trường hợp. Ví dụ, hãy tránh sử dụng nó trong ứng dụng mà cả khung hình camera và các đối tượng đều tĩnh, hoặc khi đối tượng đó đã sử dụng số lượng đa giác thấp. LOD ( Level of Detail) đòi hỏi nhiều bộ nhớ hơn và kích thước tập tin lớn hơn vì dữ liệu lưới phải được lưu lại để có thể sử dụng trong thời gian thực.

Kết hợp các lưới và ẩn các đối tượng
Bạn có thể kết hợp nhiều lưới thành một để giảm số lượng lệnh vẽ cần thiết cho quá trình hiển thị. Để áp dụng kỹ thuật này, tạo một GameObject trống trong Hierarchy và đặt nó làm đối tượng cha của các mesh mà bạn muốn kết hợp, sau đó gắn một script thực thi phương thức Mesh.CombineMeshes() vào GameObject cha đó.
Sử dụng Occlusion Culling
Các đối tượng bị che khuất phía sau các đối tượng khác vẫn có thể được hiển thị và tiêu tốn tài nguyên. Sử dụng Occlusion Culling để loại bỏ chúng.
Trong khi việc loại bỏ các đối tượng nằm ngoài tầm nhìn của camera được thực hiện tự động, thì việc loại bỏ các đối tượng bị che khuất là một quy trình được tính toán trước. Đơn giản chỉ cần đánh dấu các đối tượng của bạn là Static Occluders hoặc Static Occludees , sau đó thực hiện quá trình kết xuất thông qua hộp thoại Window > Rendering > Occlusion Culling . Mặc dù không cần thiết cho mọi cảnh, việc loại bỏ các cảnh không cần thiết có thể cải thiện hiệu suất trong nhiều trường hợp. Hãy xem hướng dẫn Làm việc với Occlusion Culling để biết thêm thông tin.

Nhập khẩu mô hình
Dưới đây là một vài lời khuyên hữu ích cần ghi nhớ khi nhập mô hình của bạn.
- Loại hoạt ảnh: Khi nhập một mô hình FBX không chứa dữ liệu hoạt ảnh, hãy đặt Loại hoạt ảnh thành Không có trong tab Rig của Cài đặt nhập. Khi bạn đặt lưới của mình vào hệ thống phân cấp, thiết lập này sẽ đảm bảo Unity không tạo ra thành phần Animator không được sử dụng.
- Vô hiệu hóa các rig và BlendShapes: Nếu mô hình của bạn không cần hoạt ảnh xương hoặc hoạt ảnh biến đổi hình dạng, hãy tắt các tùy chọn này bất cứ khi nào có thể.
- Vô hiệu hóa pháp tuyến và tiếp tuyến: Nếu bạn hoàn toàn chắc chắn rằng vật liệu lưới không cần pháp tuyến hoặc tiếp tuyến, hãy bỏ chọn các tùy chọn này để tiết kiệm thêm chi phí.
- Cài đặt nhập khẩu: Nếu mô hình của bạn không được sửa đổi trong quá trình chạy, hãy tắt tùy chọn "Đã bật đọc/ghi" từ tab "Mô hình" trong "Cài đặt nhập" để ngăn việc tạo bản sao trong bộ nhớ.
- Phân lô tĩnh/động: Ghép nhóm tĩnh là một kỹ thuật tối ưu hóa phổ biến giúp giảm số lượng lệnh vẽ. Phương pháp này lý tưởng cho các đối tượng được tạo thành từ một số lượng lớn đỉnh mà không di chuyển, xoay hoặc thay đổi kích thước trong quá trình hiển thị. Chọn tùy chọn "Static" trong Inspector chứa Mesh Renderer của mô hình mục tiêu.

Kích thước kết cấu và không gian màu
Các họa tiết có thể có kích thước khác nhau. Việc giảm kích thước của các họa tiết yêu cầu ít chi tiết sẽ giúp giảm băng thông. Ví dụ, kết cấu khuếch tán có thể được đặt thành 1024 x 1024, và bản đồ độ nhám/kim loại liên quan có thể được đặt thành 512 x 512. Hãy cố gắng giảm kích thước Texture một cách có chọn lọc, và luôn kiểm tra xem có bất kỳ hình ảnh nào bị giảm chất lượng sau đó hay không.
Hầu hết các phần mềm tạo họa tiết đều hoạt động và xuất họa tiết bằng không gian màu sRGB.
Chúng tôi khuyên bạn nên sử dụng các họa tiết khuếch tán trong không gian màu sRGB. Các họa tiết không được xử lý dưới dạng màu sắc thì không được nằm trong không gian màu sRGB. Ví dụ về các loại kết cấu này bao gồm bản đồ kim loại, độ nhám và bản đồ pháp tuyến, vì các bản đồ được sử dụng làm dữ liệu chứ không phải màu sắc. Việc sử dụng sRGB trong các bản đồ này sẽ dẫn đến hình ảnh hiển thị không chính xác trên vật liệu.
Ghi chú: Hãy đảm bảo rằng cài đặt sRGB (màu sắc kết cấu) trong cửa sổ Inspector không có dấu chọn bên cạnh các mục roughness, specular, normal maps hoặc các mục tương tự.

Nướng các chi tiết vào kết cấu
Các yếu tố như hiệu ứng che khuất môi trường xung quanh và các điểm sáng phản chiếu nhỏ có thể được tích hợp sẵn và sau đó thêm vào kết cấu khuếch tán. Cách tiếp cận này có nghĩa là bạn không cần phải phụ thuộc quá nhiều vào các shader tốn nhiều tài nguyên tính toán và các tính năng Unity để có được hiệu ứng phản chiếu ánh sáng và che khuất môi trường.

Kết cấu màu xám
Khi có thể, hãy sử dụng các họa tiết thang độ xám cho phép tô màu trong shader. Điều này giúp tiết kiệm bộ nhớ Texture nhưng phải đổi lại việc tạo ra một shader tùy chỉnh để thực hiện việc tô màu. Hãy lựa chọn kỹ thuật phù hợp khi sử dụng phương pháp này, vì không phải tất cả các vật thể đều trông đẹp khi áp dụng cách này. Việc áp dụng điều này sẽ dễ dàng hơn đối với vật thể có màu sắc đồng nhất.

Lọc kết cấu
Lọc họa tiết thường cải thiện chất lượng họa tiết trong một cảnh, nhưng nó cũng có thể làm giảm hiệu năng vì việc đạt được chất lượng họa tiết tốt hơn thường đòi hỏi nhiều tài nguyên xử lý hơn. Lọc họa tiết đôi khi có thể chiếm tới một nửa mức tiêu thụ năng lượng của GPU. Việc lựa chọn các bộ lọc kết cấu đơn giản và phù hợp hơn có thể giúp giảm mức tiêu thụ năng lượng của ứng dụng.
- Lọc theo điểm/gần nhất: Đây là hình thức lọc kết cấu đơn giản nhất và ít tốn tài nguyên tính toán nhất, mặc dù khi nhìn cận cảnh, phương pháp lọc này có thể làm cho kết cấu trông thô ráp.
- Lọc song tuyến: Bộ lọc song tuyến lấy mẫu và tính trung bình các texel lân cận để tô màu các pixel trong một Texture. Khác với phương pháp lọc lân cận, phương pháp lọc song tuyến tạo ra các điểm ảnh ít bị vỡ hạt hơn, vì các điểm ảnh có độ dốc mượt mà. Một tác dụng phụ của bộ lọc song tuyến là các họa tiết sẽ trông mờ khi nhìn ở cự ly gần.

Kích thước kết cấu và không gian màu
Phần lớn bộ nhớ của bạn có thể sẽ dành cho các họa tiết, vì vậy các thiết lập nhập khẩu ở đây rất quan trọng. Nhìn chung, hãy cố gắng tuân theo các hướng dẫn này khi nhập tài sản của bạn.
- Giảm kích thước tối đa: Hãy sử dụng các thiết lập tối thiểu để có được kết quả hiển thị chấp nhận được. Phương pháp này không gây hư hại và có thể nhanh chóng làm giảm khả năng ghi nhớ kết cấu của bạn.
- Sử dụng lũy thừa của hai (POT): Unity yêu cầu kích thước texture POT cho các định dạng nén texture trên thiết bị di động (PVRCT hoặc ETC).
- Tạo bản đồ họa tiết của bạn: Việc kết hợp nhiều họa tiết vào một họa tiết duy nhất có thể giảm số lệnh vẽ và tăng tốc độ hiển thị. Hãy sử dụng Unity Sprite Atlas hoặc TexturePacker của bên thứ ba để tạo atlas cho các họa tiết của bạn.
- Tắt tùy chọn Cho phép đọc/ghi: Khi được kích hoạt, tùy chọn này sẽ tạo một bản sao trong cả bộ nhớ có thể truy cập được bởi CPU và GPU, làm tăng gấp đôi dung lượng bộ nhớ mà kết cấu chiếm dụng. Trong hầu hết các trường hợp, hãy để chức năng này ở trạng thái tắt. Nếu bạn đang tạo kết cấu trong thời gian chạy, hãy thực thi điều này thông qua Texture2D. Áp dụng , truyền vào tham số makeNoLongerReadable được đặt thành true .
- Vô hiệu hóa các mipmap không cần thiết: Mipmap không cần thiết đối với các họa tiết có kích thước cố định trên màn hình, chẳng hạn như các hình ảnh 2D và đồ họa giao diện người dùng. Hãy bật mipmap cho các mô hình 3D có khoảng cách khác nhau so với camera.
- Sử dụng bộ lọc song tuyến: Điều này sẽ giúp tạo ra sự cân bằng giữa hiệu năng và chất lượng hình ảnh.
- Sử dụng bộ lọc trilinear một cách chọn lọc: Phương pháp này đòi hỏi băng thông bộ nhớ lớn hơn so với lọc song tuyến.
- Sử dụng bộ lọc song tuyến và bộ lọc dị hướng 2x: Hãy chọn những loại này thay vì trilinear và 1x anisotropic để cải thiện cả hình thức và hiệu năng.
- Giữ mức độ dị hướng ở mức thấp: Chỉ sử dụng cấp độ cao hơn 2 cho các tài nguyên quan trọng của trò chơi.

Nén kết cấu
Hãy sử dụng công nghệ nén kết cấu có thể mở rộng thích ứng (ATSC) cho cả iOS và Android. Đa số các trò chơi đang được phát triển thường nhắm đến các thiết bị có cấu hình tối thiểu hỗ trợ nén ATSC. Ngoại lệ duy nhất là:
- Các trò chơi iOS nhắm mục tiêu vào các thiết bị có chip A7 trở xuống (ví dụ: iPhone 5, 5S, v.v.): Sử dụng PVRTC
- Các trò chơi Android nhắm đến các thiết bị trước năm 2016: UseEricsson Texture Compression (ETC2)

Sử dụng các kênh kết cấu để đóng gói nhiều kết cấu vào một.
Việc đóng gói kênh kết cấu giúp tiết kiệm bộ nhớ kết cấu vì bạn có thể đưa ba bản đồ vào một kết cấu duy nhất. Điều này có nghĩa là số lượng bộ lấy mẫu Texture sẽ ít hơn. Phương pháp này thường được sử dụng để kết hợp độ nhám, độ mịn và/hoặc hiệu ứng kim loại vào một kết cấu duy nhất. Phương pháp này cũng có thể áp dụng cho bất kỳ mặt nạ kết cấu nào. Ví dụ, bạn cũng có thể lưu trữ mặt nạ alpha. Hình ảnh có độ trong suốt có thể chiếm nhiều bộ nhớ hơn vì chúng yêu cầu định dạng 32 bit, nhưng bằng cách sử dụng kênh trống để lưu trữ mặt nạ alpha, bạn có thể giữ kết cấu khuếch tán ở định dạng 16 bit và giảm kích thước tệp xuống một nửa.
Hãy sử dụng kênh màu xanh lá cây để lưu trữ mặt nạ quan trọng nhất. Kênh màu xanh lá cây thường có nhiều bit hơn vì mắt chúng ta nhạy cảm hơn với màu xanh lá cây và ít nhạy cảm hơn với màu xanh dương.

bóc tách bằng tia cực tím
Bản đồ UV chiếu các họa tiết 2D lên bề mặt của mô hình 3D . Giải nén UV là quá trình tạo ra bản đồ UV.
- Cách tốt nhất để giữ cho các đảo UV, tức là các đơn vị riêng lẻ của một Texture chưa được trải phẳng, càng thẳng càng tốt là nhằm giúp việc đóng gói các đảo UV dễ dàng hơn và giảm thiểu không gian lãng phí. Việc sử dụng UV thẳng cũng giúp ngăn ngừa hiệu ứng bậc thang trên các họa tiết.
- Trên các nền tảng di động, dung lượng lưu trữ Texture bị hạn chế. Do đó, kích thước họa tiết thường nhỏ hơn so với trên máy chơi game hoặc PC. Việc đóng gói UV tốt đảm bảo bạn có được độ phân giải cao nhất từ các họa tiết của mình.
- Hãy cân nhắc việc làm biến dạng nhẹ UV bằng cách giữ cho UV thẳng để có được chất lượng kết cấu tốt hơn.
- Trong một số trường hợp, bạn cần phóng đại và làm nổi bật các cạnh và bóng để cải thiện khả năng nhận diện hình dạng. Vì các nền tảng di động thường sử dụng các Texture có kích thước nhỏ hơn, nên việc thu thập tất cả các chi tiết cần thiết trong không gian nhỏ đó có thể khó khăn.
- Đối với ứng dụng di động, hãy sử dụng ít Texture hơn và tích hợp mọi chi tiết bổ sung vào một Texture duy nhất. Điều này rất quan trọng vì một số chi tiết sẽ rõ nét hơn khi được tích hợp trực tiếp vào kết cấu khuếch tán để đảm bảo chúng hiển thị tốt trên màn hình nhỏ của thiết bị di động.