Xác định những lượt kết xuất tốn kém nhất

AGI Frame Profiler cho phép bạn kiểm tra từng lượt kết xuất riêng lẻ được dùng để tạo thành một khung hình duy nhất của ứng dụng. Công cụ này thực hiện việc này bằng cách chặn và ghi lại tất cả trạng thái cần thiết để thực thi từng lệnh gọi API đồ hoạ. Trên Vulkan, việc này được thực hiện một cách tự nhiên bằng hệ thống phân lớp của Vulkan. Trên OpenGL, các lệnh được chặn bằng ANGLE, giúp chuyển đổi các lệnh OpenGL thành lệnh gọi Vulkan để có thể thực thi trên phần cứng.

Thiết bị Adreno

Để xác định các lượt kết xuất tốn kém, trước tiên, hãy xem chế độ xem dòng thời gian của AGI ở đầu cửa sổ. Thao tác này sẽ cho thấy tất cả các lượt kết xuất tạo nên thành phần của một khung hình nhất định theo thứ tự thời gian. Đây là chế độ xem tương tự như chế độ xem mà bạn sẽ thấy trong System Profiler (Trình phân tích hệ thống) nếu có thông tin về Hàng đợi GPU. Thẻ này cũng trình bày thông tin cơ bản về đường truyền kết xuất, chẳng hạn như độ phân giải của các vùng đệm khung hình đang được kết xuất, có thể cung cấp một số thông tin chi tiết về những gì đang diễn ra trong chính đường truyền kết xuất.

Chế độ xem Dòng thời gian của khung hình
Hình 1. Chế độ xem Dòng thời gian của khung hình

Tiêu chí đầu tiên bạn có thể sử dụng để điều tra các lượt kết xuất là thời gian mà chúng mất. Lượt kết xuất dài nhất có nhiều khả năng là lượt kết xuất có tiềm năng cải thiện lớn nhất, vì vậy, hãy bắt đầu bằng cách xem xét lượt kết xuất đó.

Xác định lượt kết xuất dài nhất trong chế độ xem Dòng thời gian của khung hình
Hình 2. Xác định đường kết xuất dài nhất trong chế độ xem Dòng thời gian của khung hình

Lát GPU liên quan đến lượt kết xuất có liên quan sẽ trình bày một số thông tin về những gì đang xảy ra trong lượt kết xuất:

  1. Phân nhóm: Nơi các đỉnh được đặt vào các nhóm dựa trên vị trí xuất hiện trên màn hình
  2. Kết xuất: Nơi các pixel hoặc mảnh được tô bóng
  3. Tải/lưu trữ GMEM: Khi nội dung của một vùng đệm khung hình được tải hoặc lưu trữ từ bộ nhớ GPU nội bộ vào bộ nhớ chính

Bạn có thể nắm được thông tin tổng quan về vị trí có thể xảy ra nút thắt cổ chai bằng cách xem thời gian cần thiết cho mỗi thành phần trong lượt kết xuất. Ví dụ:

  • Nếu Binning chiếm phần lớn thời gian, thì điều này cho thấy có một nút thắt với dữ liệu đỉnh, tức là có quá nhiều đỉnh, đỉnh lớn hoặc các vấn đề khác liên quan đến đỉnh.
  • Nếu quá trình Kết xuất chiếm phần lớn thời gian, thì điều này cho thấy việc tạo bóng là điểm tắc nghẽn. Các nguyên nhân có thể là do chương trình đổ bóng phức tạp, quá nhiều lượt tìm nạp kết cấu, kết xuất vào bộ đệm khung hình có độ phân giải cao khi không cần thiết hoặc các vấn đề khác có liên quan.

Bạn cũng cần lưu ý đến các hoạt động tải và lưu trữ GMEM. Việc di chuyển dữ liệu từ bộ nhớ đồ hoạ sang bộ nhớ chính tốn nhiều chi phí, vì vậy, việc giảm thiểu số lượng thao tác tải hoặc lưu trữ cũng sẽ giúp cải thiện hiệu suất. Một ví dụ thường gặp về trường hợp này là có độ sâu/khuôn tô của kho GMEM, ghi vùng đệm độ sâu/khuôn tô vào bộ nhớ chính; nếu bạn không sử dụng vùng đệm đó trong các lượt kết xuất sau này, thì có thể loại bỏ thao tác lưu trữ này và bạn sẽ tiết kiệm được thời gian khung hình cũng như băng thông bộ nhớ.

Xác định các hoạt động tải và lưu trữ GMEM
Hình 3. Xác định các tải và kho lưu trữ GMEM

Điều tra lượt kết xuất lớn

Để xem tất cả các lệnh vẽ riêng lẻ được phát hành trong quá trình truyền kết xuất:

  1. Nhấp vào đường kết xuất trong dòng thời gian. Thao tác này sẽ mở đường kết xuất trong hệ thống phân cấp có trong ngăn Commands (Lệnh) của Frame Profiler (Trình phân tích tài nguyên khung hình).

  2. Nhấp vào trình đơn của đường kết xuất. Trình đơn này sẽ hiển thị tất cả các lệnh vẽ riêng lẻ được phát hành trong đường kết xuất. Nếu đây là một ứng dụng OpenGL, bạn có thể tìm hiểu sâu hơn nữa và xem các lệnh Vulkan do ANGLE phát hành.

Ngăn lệnh
Hình 4. Ngăn lệnh

Chọn một trong các lệnh gọi vẽ. Thao tác này sẽ mở ngăn Framebuffer. Ngăn này cho biết tất cả các tệp đính kèm vùng đệm khung hình được liên kết trong quá trình vẽ này và kết quả cuối cùng của thao tác vẽ trên vùng đệm khung hình được đính kèm. Tại đây, bạn cũng có thể dùng AGI để mở cả lệnh gọi vẽ trước và lệnh gọi vẽ tiếp theo, đồng thời so sánh sự khác biệt giữa hai lệnh gọi này. Nếu chúng gần như giống hệt nhau về mặt hình ảnh, thì đây là cơ hội để loại bỏ một lệnh gọi vẽ không đóng góp vào hình ảnh cuối cùng.

Chọn từng lệnh vẽ trong ngăn Lệnh
Hình 5. Chọn từng lệnh gọi vẽ trong ngăn Lệnh

Việc mở ngăn Pipeline (Quy trình) cho lượt vẽ này sẽ cho thấy trạng thái mà quy trình đồ hoạ dùng để thực thi lệnh gọi vẽ này.

Ngăn quy trình
Hình 6. Ngăn quy trình

Input Assembler cung cấp thông tin về cách dữ liệu đỉnh được liên kết với lệnh vẽ này. Đây là một khu vực phù hợp để điều tra nếu bạn nhận thấy rằng Binning chiếm phần lớn thời gian của lượt kết xuất; tại đây, bạn có thể nhận được thông tin về định dạng đỉnh, số lượng đỉnh được vẽ và cách bố trí các đỉnh trong bộ nhớ. Để biết thêm thông tin về vấn đề này, hãy xem phần Phân tích định dạng đỉnh.

Phần Input Assembler (Trình hợp ngữ đầu vào) trong ngăn Pipeline (Quy trình)
Hình 7. Mục Input Assembler (Trình hợp nhất đầu vào) trong ngăn Pipeline (Quy trình)

Phần Vertex Shader (Chương trình đổ bóng đỉnh) cung cấp thông tin về chương trình đổ bóng đỉnh mà bạn đã dùng trong quá trình vẽ này, đồng thời cũng có thể là nơi phù hợp để điều tra nếu quá trình phân nhóm được xác định là một vấn đề. Bạn có thể thấy SPIR-V và GLSL đã được biên dịch ngược của chương trình đổ bóng được dùng, đồng thời điều tra Các vùng đệm đồng nhất được liên kết cho lệnh gọi này. Xem phần Phân tích hiệu suất của chương trình đổ bóng để biết thêm thông tin chi tiết.

Phần Vertex Shader (Chương trình đổ bóng đỉnh) trong ngăn Pipeline (Quy trình)
Hình 8. Mục Vertex Shader trong ngăn Pipeline

Mục Rasterizer (Bộ tạo ảnh raster) cho bạn biết thông tin về chế độ thiết lập chức năng cố định hơn của quy trình và có thể được dùng nhiều hơn cho mục đích gỡ lỗi trạng thái chức năng cố định, chẳng hạn như chế độ xem, kéo, trạng thái độ sâu và chế độ đa giác.

Phần Rasterizer trong ngăn Pipeline
Hình 9. Phần Trình tạo đường quét trong ngăn Quy trình

Phần Fragment Shader (Chương trình đổ bóng mảnh) cung cấp nhiều thông tin tương tự như trong phần Vertex Shader (Chương trình đổ bóng đỉnh), nhưng dành riêng cho Fragment Shader. Trong trường hợp này, bạn có thể thấy những hoạ tiết đang được liên kết và điều tra chúng bằng cách nhấp vào tay cầm.

Phần Chương trình đổ bóng mảnh trong ngăn Quy trình
Hình 10. Phần Chương trình đổ bóng mảnh trong ngăn Quy trình

Điều tra lượt kết xuất nhỏ hơn

Một tiêu chí khác mà bạn có thể sử dụng để cải thiện hiệu suất GPU là xem xét các nhóm lượt kết xuất nhỏ hơn. Nói chung, bạn nên giảm thiểu số lượng lượt kết xuất càng nhiều càng tốt, vì GPU cần thời gian để cập nhật trạng thái từ lượt kết xuất này sang lượt kết xuất khác. Các lượt kết xuất nhỏ hơn này thường được dùng để thực hiện những việc như tạo bản đồ bóng, áp dụng hiệu ứng làm mờ Gaussian, ước tính độ chói, thực hiện các hiệu ứng xử lý hậu kỳ hoặc kết xuất giao diện người dùng. Một số thành phần trong số này có thể được hợp nhất thành một lượt kết xuất duy nhất, hoặc thậm chí bị loại bỏ hoàn toàn nếu chúng không ảnh hưởng đến hình ảnh tổng thể đến mức cần thiết để biện minh cho chi phí.

Các lượt kết xuất nhỏ hơn được dùng để giảm mẫu vùng đệm độ phân giải gốc
Hình 11. Các lượt kết xuất nhỏ hơn được dùng để giảm mẫu vùng đệm độ phân giải gốc