Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Bạn vừa bỏ ra số đô la vất vả mới kiếm được để mua trò chơi AAA mới nhất trên chiếc PC chơi game quý giá của mình. Một lần tải xuống kéo dài sau đó, bạn nhảy ngay vào trò chơi, chỉ để đối mặt với sự chờ đợi lâu ở menu chính trong khi nó tự sắp xếp…

Hoặc có thể điều đó không xảy ra. Nhưng bạn thấy mình gặp phải rất nhiều vấn đề về tốc độ khung hình trong khi chơi trò chơi. Tuyệt vọng tìm kiếm một giải pháp, bạn lướt web để tìm kiếm câu trả lời và tình cờ bắt gặp một cụm từ thường được lặp đi lặp lại: ” biên dịch đổ bóng .”

Bạn có muốn biết trình biên dịch shader là gì, tại sao nó lại cần thiết và tại sao nó lại nhận được báo chí tiêu cực như vậy không? Vâng, đây là bài viết hoàn hảo cho bạn.

Về cơ bản, shader chỉ là các khối mã. Trong thế giới đồ họa và kết xuất 3D, mỗi cái là một chương trình nhỏ được thiết kế để tạo ra một đầu ra rất cụ thể. Nó có thể là chuyển đổi hình dạng hoặc vị trí của một hình tam giác, ánh xạ kết cấu thành một hình dạng hoặc tính toán một tập hợp các giá trị được yêu cầu cho các trình đổ bóng khác.

Khi các API như Direct3D và OpenGL lần đầu tiên hỗ trợ các shader, chúng cực kỳ hạn chế về kích thước và phạm vi. Ví dụ: khi trình đổ bóng pixel lần đầu tiên xuất hiện trên PC, hơn 20 năm trước, chỉ có 4 lệnh liên quan đến kết cấu và 8 lệnh để làm toán.

Ngày nay, trong phiên bản mới nhất của tất cả các shader, thực tế không có giới hạn về số lượng hướng dẫn có thể được đóng gói vào mã…

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Mặc dù các API khác nhau được các nhà phát triển sử dụng có thuật ngữ khác nhau, nhưng có bảy loại trình đổ bóng. Các trình tạo bóng đỉnh, hình học, thân tàu và miền đều nhằm xử lý các đỉnh của hình tam giác – tạo và định hình thế giới 3D trước khi nó được tô màu.

Đọc thêm:  Hướng dẫn mua máy tính TechSpot: H1 2022

Nhiệm vụ đó được xử lý bởi các trình đổ bóng pixel (và gần đây hơn là tia), xử lý phép toán liên quan đến ánh sáng và kết cấu. Cuối cùng, các shader tính toán đều nhằm thực hiện xử lý số học và logic cho mục đích chung, chứ không phải bất kỳ thứ gì cụ thể cho đồ họa.

Các game 3D hiện đại sử dụng hàng nghìn shader để tính toán hình ảnh hiển thị trên màn hình. Một số rất ngắn và đơn giản, một số khác có thể cực kỳ dài và rất phức tạp, hút hết tài nguyên mà GPU có thể cung cấp.

Và mỗi một trong số chúng cần được xử lý trước khi GPU có thể làm bất cứ điều gì với chúng.

Biên dịch phần mềm là quá trình chuyển đổi mã nguồn thành mã máy thực thi được. Mã nguồn có thể được viết bằng bất kỳ ngôn ngữ lập trình nào, sau đó được chuyển thành mã nhị phân để phần cứng máy tính thực thi.

Trình tạo bóng không khác, chúng được viết bằng một ngôn ngữ nhất định, vì vậy việc tạo chúng và hiểu những gì đang diễn ra sẽ dễ dàng hơn. Có thể thấy một ví dụ về điều này bằng cách sử dụng ShaderToy. Để sử dụng phiên bản trực tuyến của công cụ này, mã được viết bằng GLSL (OpenGL Shading Language) và nhằm mục đích đồ họa API WebGL để kết xuất.

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Trong ví dụ bên dưới, mã được hiển thị là một phần của quy trình cần thiết để tạo bề mặt của địa hình nhìn thấy trong hình ảnh cuối cùng – bạn có thể theo dõi cách mã được tạo bằng cách xem video này.

Ngay cả khi bạn không biết bất kỳ mã nào trong số đó có nghĩa là gì, điều đó cũng không thành vấn đề – chip đồ họa của bạn cũng vậy. Nó có thể thực hiện tất cả các phép tính, nhưng nó cần được cung cấp các hướng dẫn ở dạng nhị phân. Mã cần được biên dịch từ WebGL thành hướng dẫn GPU – trong trường hợp bất kỳ thứ gì sử dụng GPU để có kết quả cuối cùng, quá trình biên dịch được thực hiện bởi trình điều khiển GPU, với CPU xử lý khối lượng công việc đó.

Đọc thêm:  Hướng dẫn mua máy tính TechSpot (Cuối năm 2015)

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Ví dụ ShaderToy này chỉ sử dụng một số ít trình tạo bóng và chỉ một trong số chúng có độ dài hợp lý. Mặc dù vậy, một CPU máy tính để bàn trung bình chỉ mất một phần giây để biên dịch tất cả, vì vậy việc này được thực hiện một lần, ngay khi bạn bắt đầu bản demo.

Tuy nhiên, hãy chọn bất kỳ trò chơi 3D hiện đại nào và đó hoàn toàn là một câu chuyện khác. Du hành quanh môi trường, đi đến một cấp độ khác hoặc chiến đấu với kẻ thù mới yêu cầu trò chơi tải các bộ tạo bóng mới từ ổ lưu trữ rồi biên dịch chúng.

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Các trò chơi trên bảng điều khiển, chẳng hạn như PS5 hoặc Xbox Series, thường có tất cả các trình đổ bóng được biên dịch trước, mặc dù không phải lúc nào cũng vậy. Điều này là do cấu hình phần cứng rất tĩnh – các nhà phát triển tạo tiêu đề mới cho máy của Sony hoặc Microsoft chỉ cần quản lý một loại GPU và hệ điều hành cũng như trình điều khiển của máy không thường xuyên thay đổi.

Tuy nhiên, máy tính để bàn gây ra vấn đề đau đầu về mặt này, vì có hàng nghìn cách kết hợp có thể có giữa hệ điều hành, trình điều khiển và chip đồ họa. Sẽ không thể biên dịch trước các shader cho tất cả chúng, vì vậy các nhà phát triển sử dụng nhiều cách tiếp cận khác nhau để giải câu đố này.

Đọc thêm:  Hướng dẫn cơ bản để mua card đồ họa đã qua sử dụng

Một cách tiếp cận phổ biến là chuyển đổi tất cả các shader sẽ được trò chơi sử dụng khi trò chơi tải lên – đôi khi trong trình tự khởi động chính, những lần khác khi đang ở menu chính hoặc khi tải cấp độ ban đầu.

Nếu một trò chơi có hàng chục nghìn trình đổ bóng, thì việc biên dịch tất cả chúng ngay từ đầu có khả năng khiến thời gian tải này trở nên quá lâu. Việc quản lý kém thư viện đổ bóng, trong quá trình tạo trò chơi, sẽ chỉ làm trầm trọng thêm vấn đề này, vì thời gian và dung lượng lưu trữ sẽ bị lãng phí khi biên dịch thứ gì đó sẽ không bao giờ được sử dụng.

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Tuy nhiên, điều đó ít nhất có nghĩa là mã shader đã sẵn sàng để các trình điều khiển sử dụng, thời điểm công cụ kết xuất của trò chơi đưa ra các lệnh cho GPU. Phương pháp ngược lại với tất cả những điều này là tránh chuyển đổi chúng ngay từ đầu và thực hiện tất cả khi chúng được yêu cầu, trong khi chơi trò chơi.

Điều này rõ ràng sẽ tăng tốc độ tải nhưng quá trình biên dịch thời gian thực có thể tạo ra các điểm dừng trong chuỗi xử lý đồ họa, trong khi CPU chạy quá trình chuyển đổi.

Những điều này thường xảy ra ở dạng giảm tốc độ khung hình trung bình của trò chơi một cách đột ngột nhưng rất ngắn. Được biết đến nhiều hơn với tên gọi nói lắp , vấn đề này có thể từ không gì khác hơn là một tiếng nấc đơn lẻ, nhất thời cho đến một mớ hỗn độn kinh khủng, giật cục thường xuyên.

Nói lắp trong trò chơi không chỉ do quá trình biên dịch shader gây ra, vì có rất nhiều khía cạnh trong quá trình kết xuất có thể dẫn đến điều này, nhưng vấn đề cụ thể này là một vấn đề ngày càng trở nên phổ biến hơn.

Đọc thêm:  Ryzen 7 5800X3D có hoạt động trên Bo mạch chủ AMD B350 và X370 không?

Điều này là do xu hướng trong các tựa game AAA là có đồ họa chân thực hơn hoặc ấn tượng hơn về mặt hình ảnh, đặc biệt là trong thể loại thế giới mở phổ biến. Do đó, các shader ngày càng dài hơn và phức tạp hơn, cũng như tăng về số lượng và tất cả những thứ này đều mất nhiều thời gian hơn để biên dịch.

Có nhiều trò chơi sử dụng cách tiếp cận trung gian để biên dịch shader, xử lý những trò chơi chính trong khi tải hoặc tại menu chính và thực hiện phần còn lại khi chúng được yêu cầu. Nhưng để có được quyền này trên nền tảng PC là một thách thức của riêng nó.

Những game thủ đã quen thuộc với các tựa game được tạo bằng Unreal Engine, đặc biệt là phiên bản 4, sẽ biết rất rõ điều này, mặc dù đây không phải là vấn đề dành riêng cho UE4. Việc ra mắt các cổng PC của Horizon Zero Dawn và Death Stranding, cả hai đều được thực hiện bằng công cụ Decima độc quyền, đã bị hủy hoại bởi các báo cáo thường xuyên về tình trạng nói lắp liên tục, phần lớn là do các vấn đề biên dịch shader và được giải quyết trong các bản vá sau khi ra mắt.

Thật không may cho các game thủ, bạn không thể làm gì nhiều với nó. Vì CPU xử lý các nhiệm vụ biên dịch nên việc giảm thiểu số lượng tác vụ nền có thể hữu ích, cũng như giảm chất lượng đồ họa của trò chơi, nhưng đó là điều mà hầu như người dùng nào cũng có thể làm được.

Rất ít trò chơi cung cấp tùy chọn để thay đổi cách quản lý quá trình biên dịch shader. Horizon Zero Dawn đã nói ở trên, với bản vá mới nhất, sẽ thực hiện quá trình biên dịch shader trong menu chính, nhưng cho phép bạn bỏ qua nếu mất quá nhiều thời gian – điều này sẽ xảy ra trên phần cứng cấp thấp.

Đọc thêm:  25 trò chơi tuyệt vời bạn có thể chơi trên máy tính xách tay và PC giá rẻ

Một cái gì đó giống như Di sản Hogwarts gần đây không cung cấp cho bạn tùy chọn như vậy và phần lớn quá trình biên dịch được thực hiện khi trò chơi bắt đầu, trước khi đến menu chính. Cả hai cách tiếp cận dường như không đặc biệt tối ưu vì cả hai tựa game vẫn sẽ xử lý nhiều shader hơn một cách đáng chú ý khi bạn đang chơi.

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Các nhà sản xuất GPU cũng đóng một vai trò ở đây, vì phần mềm của họ đang thực hiện quá trình biên dịch. Trình điều khiển của AMD và Nvidia sẽ lưu trữ các trình tạo bóng đã biên dịch từ các trò chơi thường chơi trong một thư mục trên ổ lưu trữ chính, nhưng thời điểm trò chơi hoặc trình điều khiển được cập nhật, quá trình này cần phải được lặp lại.

Bạn có thể nghĩ rằng những nhà cung cấp này có thể làm nhiều hơn để cải thiện hiệu suất của trình biên dịch shader, nhưng ngày nay, nó nhanh hết mức có thể.

Tại thời điểm này, bạn cũng có thể nghĩ rằng một số loại dịch vụ trực tuyến lưu trữ các trình tạo bóng được biên dịch cho mọi trò chơi, phần cứng và cấu hình trình điều khiển sẽ đáng để sở hữu. Valve cung cấp một thứ như vậy, như một dịch vụ bộ đệm trong Steam, nhưng chỉ dành cho các trò chơi sử dụng OpenGL hoặc Vulkan. Tuy nhiên, thường xuyên hơn không, bộ đệm luôn xuất hiện trống.

Cuối cùng, các nhà phát triển trò chơi chịu trách nhiệm giảm thiểu tác động của việc biên dịch shader. Một số rất giỏi trong việc này và dường như cố gắng hết sức để giảm thiểu tật nói lắp, trong khi những người khác thì kém chăm chỉ hơn nhiều (đây là ý kiến của bạn, FromSoftware).

svg+xml,%3Csvg%20xmlns= Shader Compilation và tại sao nó gây ra nói lắp, giải thích

Đọc thêm:  Đã kiểm tra: Cuối cùng thì Ryzen Mobile cũng có trình điều khiển tốt hơn

Những nhà phát triển hiểu biết nhất (ví dụ: Infinity Ward, nhà sản xuất CoD) sẽ biết rằng họ cần sử dụng mọi thủ thuật trong sách để ngăn quá trình chuyển đổi mã làm gián đoạn quá trình kết xuất, bằng cách ẩn nó trong menu, đoạn cắt cảnh, giữa chừng. các giai đoạn tải cấp, v.v.

Có nhiều kinh nghiệm và hiểu biết về các chi tiết tốt hơn của động cơ đang được sử dụng cũng là điều quan trọng. Ví dụ: khi tạo trò chơi trong UE4, giao diện bề mặt của mọi đối tượng và phần của môi trường được tạo bởi các mục gọi là vật liệu. Theo mặc định, việc tạo những thứ này sẽ tạo ra một loạt các shader, nhiều trong số đó có thể không cần thiết.

Nếu một người không quản lý điều này một cách chính xác, thì vấn đề sẽ chỉ xuất hiện trong quá trình kiểm tra chất lượng/hiệu suất. Tất nhiên, các nhà quản lý phát triển phân bổ tài chính và thời gian cho những việc như vậy, nhưng điều này chỉ đi xa và nếu trò chơi đang gặp nhiều vấn đề khác, thì việc giải quyết tình trạng nói lắp do biên dịch shader có thể không nhận được đủ sự quan tâm đúng lúc để ra mắt.

Các bản vá sau khi phát hành thường cố gắng giảm bớt những vấn đề như vậy, điều này cho thấy rõ ràng rằng các nhà phát triển không cung cấp cho các phiên bản PC của trò chơi của họ đủ thử nghiệm QA. Và cho rằng điều này tốn tiền, miễn là hàng triệu người vẫn đang mua các trò chơi mới nhất nói lắp, rất nhiều nhà quản lý sẽ không sẵn sàng chi nhiều tiền hơn để tối ưu hóa mọi thứ.

Vì vậy, có thể, chỉ có thể thôi, vấn đề có thể được chúng tôi khắc phục – tất cả đều thông qua sức mạnh ví của chúng tôi.