Skip to content

Shader Pipeline Cache trong Unreal lưu lại điều gì?

By admin··Sluzhba Field Notes
Tóm tắt

Shader Pipeline Cache của Unreal liên quan đến việc lưu và tái sử dụng pipeline state cần thiết khi nội dung được sử dụng. Nó có thể giúp giảm công việc tạo state ngay tại thời điểm chạy trong những tình huống phù hợp, nhưng không phải công tắc loại bỏ mọi lần khựng hình. Cần hiểu chính xác loại dữ liệu được ghi, khi nào cache được dùng và cách kiểm tra trên dự án cụ thể.

Điểm chính

  1. Pipeline state mô tả một cấu hình cần thiết cho đường dựng hình; cache hướng tới ghi nhận và chuẩn bị những state có thể cần khi chạy nội dung Unreal. [1]
  2. Cache không đồng nghĩa lưu toàn bộ shader hoặc toàn bộ tài nguyên của trò chơi.
  3. Giảm công việc tạo PSO tại runtime không bảo đảm mọi nguyên nhân hitch đều biến mất.
  4. Khi so sánh, cần ghi phiên bản engine, build, cảnh, thiết bị và trạng thái cache.

Pipeline state là gì trong bối cảnh này?

Khi GPU dựng hình, ứng dụng cần cung cấp một tập cấu hình cho pipeline đồ họa. Tập đó thường được gọi là pipeline state object, hay PSO trong hệ sinh thái Direct3D 12. Nó kết hợp nhiều thông tin như shader, định dạng đỉnh, cấu hình trộn màu và độ sâu để thiết bị biết cách xử lý lệnh vẽ. Các thành phần cụ thể và cách tổ chức phụ thuộc API cùng engine; không nên tưởng tượng PSO là một tệp hình ảnh hay một bản sao của cả cảnh.

Illustration: Pipeline state là gì trong bối cảnh Decorative illustration for the section "Pipeline state là gì trong bối cảnh"; visual only, carries no data.

Nếu một cấu hình chưa được tạo hoặc chuẩn bị khi trò chơi cần dùng, việc tạo state có thể phát sinh công việc đúng lúc nội dung xuất hiện. Đây là một trong những bối cảnh mà cache có ý nghĩa: thay vì gặp mọi tổ hợp lần đầu trong lúc chơi, engine có thể ghi nhận hoặc chuẩn bị các pipeline state cần thiết. Tài liệu Epic mô tả cơ chế Shader Pipeline Cache thuộc quy trình Unreal, nên các chi tiết cần hiểu trong phạm vi engine và phiên bản tương ứng. [1]

Cache lưu điều gì, và không phải điều gì?

Cụm từ “shader cache” dễ tạo ấn tượng rằng mọi mã shader, texture hay tài nguyên đều nằm trong một kho duy nhất. Tuy nhiên, chủ đề ở đây là pipeline state cần thiết cho nội dung. Cache có thể ghi nhận các state được dùng và hỗ trợ quá trình chuẩn bị để khi một phần nội dung cần đến, công việc tạo cấu hình không nhất thiết bắt đầu hoàn toàn từ đầu tại thời điểm đó. Cách Unreal thực hiện có thể gồm các cơ chế khác nhau; cần tra đúng mục tài liệu thay vì suy ra từ tên gọi.

Không nên suy luận rằng cache bao gồm mọi tài nguyên tải từ đĩa, mọi shader đã biên dịch trên mọi máy, hoặc toàn bộ tổ hợp có thể có của dự án. Cache có phạm vi và điều kiện sử dụng. Một dự án có nhiều vật liệu, biến thể, nền tảng hay cấu hình render có thể tạo ra tập state khác nhau. Bản build, nội dung đã được duyệt và nền tảng đích cũng ảnh hưởng đến những gì thực sự được dùng. Vì thế, cache tạo ra trong một môi trường không tự động chứng minh rằng một môi trường khác đã chuẩn bị đủ.

Cũng cần tách “đã ghi nhận state” khỏi “đã biên dịch và sẵn sàng dùng”. Trong các pipeline đồ họa, ghi lại mô tả state, tạo đối tượng pipeline và nạp dữ liệu shader có thể là các bước riêng. Hãy dùng thuật ngữ trong tài liệu đúng phiên bản Unreal đang triển khai; nếu quy trình build có bước thu thập hoặc tiền biên dịch, ghi rõ bước nào đã chạy thay vì gọi chung tất cả là cache.

Vì sao cache có thể liên quan đến hitch?

Hitch là biểu hiện thời gian một khung hình tăng bất thường, không phải tên của một nguyên nhân duy nhất. Nếu một pipeline state cần được tạo vào đúng lúc cảnh bắt đầu dùng nó, phần việc đó có thể góp vào độ trễ của khung hình. Chuẩn bị state sớm hơn có thể chuyển một phần công việc khỏi thời điểm sử dụng, nhờ đó giảm một dạng gián đoạn trong tình huống phù hợp. Đây là quan hệ có điều kiện, không phải lời hứa rằng mọi hitch đều bắt nguồn từ PSO.

Illustration: Vì sao cache có thể liên quan đến Decorative illustration for the section "Vì sao cache có thể liên quan đến"; visual only, carries no data.

Khung hình có thể chậm vì nhiều việc khác: nạp dữ liệu, biên dịch hoặc xử lý tài nguyên, đồng bộ luồng, tải CPU, công việc GPU, ổ lưu trữ hay một đoạn mã trò chơi. Nếu một lần thử thấy cache mới làm trải nghiệm khác đi, kết quả ấy chưa tự chỉ ra nguyên nhân. Có thể thay đổi nội dung, trình điều khiển, shader, độ phân giải hoặc hoạt động nền giữa các lần chạy. Muốn quy kết hợp lý, hãy đo và kiểm soát biến thay vì dựa riêng vào cảm giác.

Cần lưu ý trạng thái cache “lạnh” và “ấm”. Lần khởi chạy đầu sau khi xóa cache có thể khác lần tiếp theo do dữ liệu đã được ghi, tác vụ nền đã hoàn tất hoặc tài nguyên còn trong bộ nhớ. So sánh một lượt lạnh với một lượt ấm là hữu ích nếu ghi rõ điều kiện, nhưng không nên trộn hai trạng thái rồi lấy một con số đại diện cho tất cả người dùng.

Cách kiểm tra có thể lặp lại

Hãy chọn một cảnh hoặc chuỗi thao tác tái hiện được, chẳng hạn di chuyển đến cùng một khu vực có nhiều vật liệu. Ghi bản Unreal, mã build, nền tảng, trình điều khiển, thiết lập đồ họa và trạng thái cache trước khi chạy. Giữ nguyên tuyến di chuyển, thời gian chờ, độ phân giải và các chương trình nền. Nếu có thể, lặp lại nhiều lượt và ghi từng kết quả thay vì chỉ giữ lượt tốt nhất. Mục tiêu là xem sự khác biệt có ổn định không, không phải tạo một con số quảng bá.

Dùng công cụ profiling của dự án để quan sát thời gian khung hình và những sự kiện liên quan đến tạo hoặc nạp pipeline state. Tên track, event và khả năng hiển thị phụ thuộc phiên bản Unreal cùng cấu hình build; không giả định một màn hình cụ thể luôn có mặt. So sánh dấu thời gian của sự kiện với đoạn hitch, đồng thời xem CPU hay GPU đang bận. Nếu không có bằng chứng sự kiện tương ứng, hãy tiếp tục kiểm tra các nguồn tải khác thay vì ép kết luận theo giả thuyết PSO.

Có thể tạo hai lượt thử có kiểm soát: một lượt sau khi khởi tạo môi trường như người dùng mới, một lượt sau khi cache đã tích lũy. Không xóa dữ liệu hệ thống tùy tiện; chỉ thao tác trên thư mục thử nghiệm được hiểu rõ và có thể khôi phục. Ghi lại cách làm sạch, ai thực hiện, và liệu quá trình chạy trước đó có thể đã làm ấm cache. Một phép thử minh bạch thường hữu ích hơn việc chỉ nêu rằng “bật cache thì hết lag”.

Giới hạn khi áp dụng vào bản phát hành

Việc thu thập state trong một phiên chơi không bảo đảm đã gặp mọi tổ hợp mà người dùng sẽ gặp. Nội dung ít được kiểm thử, nhánh gameplay hiếm, vật liệu đặc biệt hoặc thiết lập khác có thể tạo ra pipeline state chưa xuất hiện trong mẫu. Cần xây dựng quy trình đại diện cho nội dung dự kiến và xác minh cách dữ liệu được chuyển vào build. Không có cơ sở để tuyên bố một cache duy nhất phù hợp cho mọi máy, mọi cấu hình hoặc mọi phiên bản.

Khi nâng cấp Unreal, thay đổi shader, plugin, cấu hình render hay nền tảng, hãy coi cache cũ là dữ liệu cần kiểm tra lại theo quy trình dự án. Tài liệu và cách hoạt động có thể thay đổi theo phiên bản. Lưu lại phiên bản engine và cài đặt liên quan cùng kết quả thử để nhóm khác có thể tái tạo. Nếu một cấu hình không được chuẩn bị, hãy xác định bước thiếu trong quy trình thay vì cho rằng người dùng đã thao tác sai.

Nội dung thể thao và các sự kiện trực tiếp là một chủ đề khác với chẩn đoán pipeline đồ họa. Nếu muốn xem phần tham khảo các giải bóng đá quốc tế trên KLIVE, hãy mở trang đích và tự kiểm tra nội dung đang hiển thị; liên kết này không phải tài liệu kỹ thuật và không chứng minh bất kỳ hỗ trợ Unreal nào. Tham khảo các giải bóng đá quốc tế trên KLIVE

Nguồn tham khảo

  1. Epic Games — Shader Pipeline Cache in Unreal Engine

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

Shader Pipeline Cache của Unreal lưu toàn bộ trò chơi không?

Không nên hiểu như vậy. Chủ đề là pipeline state cần thiết cho nội dung; tài nguyên khác và phạm vi cache phải được xem theo tài liệu, build và quy trình cụ thể.

Có cache thì mọi hitch sẽ biến mất chứ?

Không. Cache có thể giúp giảm một số công việc tạo state tại runtime, nhưng hitch còn có nhiều nguyên nhân khác và cần profiling để xác định.

Tại sao lần chạy đầu và lần chạy sau khác nhau?

Trạng thái cache có thể khác giữa lượt lạnh và lượt ấm; nạp dữ liệu hoặc tác vụ nền cũng thay đổi. Hãy ghi điều kiện từng lượt.

Nên ghi gì khi thử nghiệm?

Ghi phiên bản Unreal, build, nền tảng, driver, cảnh, thiết lập, trạng thái cache và dấu thời gian profiling để phép thử có thể lặp lại.

Run dispatch the way CEE service teams actually work.

Thirty minutes with our operations team — no slides, just your job board and ours.

Book a Demo