Tóm tắt

Một shader variant là một cấu hình shader được biên dịch từ các lựa chọn như keyword, pass và nền tảng đích. Dự án có thể tạo nhiều biến thể khi kết hợp các lựa chọn, nhưng số lượng thực tế phụ thuộc cấu hình và cách tổ chức của dự án. Tài liệu Unity mô tả cả quá trình biên dịch lẫn việc loại bỏ biến thể không cần thiết; cần giữ lại những tổ hợp mà nội dung game thực sự dùng.

Điểm chính

  1. Keyword shader và cấu hình build góp phần xác định các biến thể được biên dịch. [1]
  2. Không thể gán một số lượng variant cố định cho mọi dự án Unity.
  3. Stripping có thể loại biến thể khỏi build nhưng phải bảo toàn trường hợp được sử dụng.
  4. Kiểm tra báo cáo build và nội dung chạy thực tế thay vì chỉ nhìn một con số tổng.
  5. Thử nghiệm theo cấu hình giúp tách vấn đề compile khỏi vấn đề hiển thị.

Variant biểu thị một cấu hình shader

Shader mô tả cách xử lý đồ họa; trong dự án game, cùng một shader có thể cần nhiều phiên bản theo tính năng bật tắt, pass hoặc nền tảng. Khi những lựa chọn được thể hiện bằng keyword, quá trình biên dịch có thể tạo các tổ hợp tương ứng. Do đó, “shader này có bao nhiêu variant?” không có đáp án độc lập với dự án: cần biết shader khai báo lựa chọn nào, tài sản nào dùng nó và build nhắm đến nền tảng nào. [1]

Từ “variant” không có nghĩa mỗi cấu hình chắc chắn được dùng trong mỗi cảnh. Một lựa chọn có thể tồn tại trong khai báo nhưng không xuất hiện trong tài sản được đóng gói; ngược lại, một tổ hợp hiếm chỉ phát sinh trên cấu hình đồ họa hoặc nội dung cụ thể. Cần phân biệt số tổ hợp tiềm năng, số biến thể được biên dịch và số biến thể thực sự được tải trong lúc chạy. Các đại lượng này trả lời những câu hỏi khác nhau.

Keyword và cấu hình làm thay đổi tập biến thể

Keyword cho phép shader chọn nhánh chức năng, chẳng hạn một hiệu ứng hoặc một đường xử lý. Khi có nhiều keyword độc lập, tổ hợp khả dĩ có thể tăng nhanh, nhưng số tổ hợp thật sự được dùng còn phụ thuộc cách dự án bật chúng. Không nên nhân máy móc số trạng thái của mọi keyword rồi coi kết quả là số variant cuối cùng: shader, pipeline, stripping và nội dung build đều có thể làm tập hợp thay đổi.

Illustration: Keyword và cấu hình làm thay đổi Decorative illustration for the section "Keyword và cấu hình làm thay đổi"; visual only, carries no data.

Nền tảng đích cũng quan trọng vì khả năng đồ họa, API và thiết lập dự án có thể khác nhau. Một build dành cho một nền tảng không nhất thiết mang cùng tập shader với build nền tảng khác. Khi so sánh hai báo cáo, hãy giữ cùng phiên bản Unity, cấu hình build, nền tảng và nội dung đầu vào. Nếu thay nhiều điều kiện cùng lúc, chênh lệch về thời gian hoặc số mục không cho biết yếu tố nào đã tạo ra khác biệt.

Stripping giảm phần không cần nhưng đòi hỏi kiểm chứng

Unity hỗ trợ giảm shader variant để tránh giữ mọi cấu hình có thể có trong bản build. Ý tưởng là bỏ những biến thể không cần cho nội dung được đóng gói hoặc cấu hình đang xét. Tuy nhiên, một variant không được nhìn thấy trong lượt thử ngắn vẫn có thể cần ở màn chơi, thiết bị, chất lượng đồ họa hay nội dung tải về khác. Nếu loại quá mạnh, biểu hiện có thể chỉ lộ ra ở một nhánh ít được thử.

Trước khi thay quy tắc stripping, lập danh sách các cấu hình quan trọng: cảnh, vật liệu, hiệu ứng, chế độ đồ họa và nền tảng. Tạo build thử với thay đổi giới hạn, kiểm tra nội dung đại diện rồi xem log hoặc báo cáo shader. Tài liệu Unity giải thích cơ chế biên dịch và giảm variant, nhưng không thể thay thế kiểm tra các tổ hợp cụ thể của dự án. Hãy xem thay đổi stripping như một quyết định có điều kiện, không phải nút tối ưu luôn an toàn. [1]

Tách thời gian biên dịch khỏi hiệu năng khi chơi

Nhiều biến thể có thể liên quan đến công việc biên dịch hoặc kích thước dữ liệu shader, nhưng chỉ một con số variant không chứng minh build chậm vì đúng nguyên nhân đó. Thời gian còn chịu ảnh hưởng bởi phần cứng phát triển, cache, nền tảng, mức song song và những tác vụ build khác. Hãy so sánh cùng môi trường và ghi thời gian theo giai đoạn; phân biệt compile shader với thời gian đóng gói toàn bộ dự án.

Illustration: Tách thời gian biên dịch khỏi hiệu Decorative illustration for the section "Tách thời gian biên dịch khỏi hiệu"; visual only, carries no data.

Tương tự, giảm số variant trong build không tự động chứng minh FPS tăng. Tốc độ hiển thị phụ thuộc đường chạy, GPU, CPU, tài nguyên và nhiều thành phần khác. Nếu đang điều tra khựng hình, đo biểu hiện chạy thực tế và xem dữ liệu profiler phù hợp; nếu điều tra thời gian build, theo dõi log biên dịch. Hai vấn đề có thể liên quan nhưng cần bằng chứng riêng, tránh dùng thay đổi build làm kết luận hiệu năng.

Xây dựng quy trình kiểm tra có thể lặp lại

Ghi lại phiên bản Unity, nền tảng, cấu hình đồ họa, danh sách keyword và thay đổi gần nhất. Chạy build cơ sở, lưu báo cáo; sau đó chỉ thay một nhóm lựa chọn và lặp lại trên cùng máy. Kiểm tra cả nội dung thường xuyên lẫn những cảnh có hiệu ứng hoặc vật liệu đặc thù. Nếu một lỗi hình ảnh xuất hiện, xác định shader, trạng thái keyword và điều kiện tái hiện trước khi quy lỗi cho stripping.

Khi chia sẻ kết quả, nói rõ đó là dự án thử nào và phép đo nào đã thực hiện. Không khái quát từ một trò chơi sang mọi dự án Unity hoặc tuyên bố một bộ keyword luôn tạo cùng số lượng. Tài liệu chính thức giúp xác định thuật ngữ và cơ chế nền; dữ liệu dự án mới cho biết biến thể nào cần thiết trong sản phẩm cụ thể.

Theo dõi nội dung thể thao trực tiếp

Nếu cần đổi chủ đề sau phần kỹ thuật đồ họa, có thể tham khảo Trang theo dõi nội dung thể thao trực tiếp của KLIVE. Trang đích phục vụ khám phá nội dung thể thao; liên kết này không hàm ý KLIVE sử dụng Unity shader hay có quan hệ kỹ thuật với công cụ được bàn ở đây.

Illustration: Theo dõi nội dung thể thao trực Decorative illustration for the section "Theo dõi nội dung thể thao trực"; visual only, carries no data.

Nếu cần chuyển từ khái niệm trong bài sang nội dung thể thao, Trang theo dõi nội dung thể thao trực tiếp của KLIVE là một lựa chọn tham khảo; hãy kiểm tra trang trực tiếp.

Nguồn tham khảo

  1. Unity — Shader compilation

Câu hỏi thường gặp

Mọi dự án Unity có cùng số shader variant không?

Không. Số lượng tùy shader, keyword, nội dung, nền tảng và cấu hình build.

Có thể tắt stripping để tránh mọi lỗi shader không?

Không nên coi đó là giải pháp chung. Cần xác định biến thể được dùng và kiểm tra cấu hình mục tiêu.

Giảm variant có bảo đảm tăng FPS không?

Không. Số variant và hiệu năng khi chạy là những vấn đề cần đo bằng dữ liệu phù hợp.