Các kỹ thuật tối ưu hóa kết xuất phổ biến cho vượt qua hình học trong trình kết xuất bóng mờ bị trì hoãn là gì? [đóng cửa]


16

Tôi đã phát triển một công cụ trò chơi bằng OpenGL 3 và C ++ (và glfw để quản lý cửa sổ). Tôi đã tiến bộ cho đến nay, đã hoàn thành hầu hết mọi thứ trừ các thực thể âm thanh và tối ưu hóa. Công cụ sử dụng bóng mờ bị trì hoãn vì vậy bóng mờ bị trì hoãn tự nó là một quá trình mệt mỏi cho một GPU trung bình, tôi muốn tối ưu hóa quá trình kết xuất càng nhiều càng tốt.

Hệ thống hiện tại bao gồm một Cảnh, chứa Trình kết xuất và Thế giới hiện tại và Thế giới giữ các thực thể và thực thể chiếu sáng là riêng biệt std::vectors.

Vì vậy, về cơ bản, mỗi khi Cảnh được gọi ->render()và nó gọi Trình kết xuất, truyền thế giới làm tham số và nhận các trình lặp thực thể từ thế giới, đưa chúng đến FBO và sau đó đi qua các thực thể chiếu sáng cho lần thứ hai. Và tôi nghĩ rằng điều này là không đủ.

Thuật toán hiện tại của tôi lặp đi lặp lại qua mọi thứ ngay cả khi thực thể không ở trong không gian màn hình. Tôi đang nghĩ cách để tối ưu hóa thuật toán kết xuất hiện tại để nó chỉ gọi các hàm API chỉ cho các đối tượng hiển thị, vậy các kỹ thuật phổ biến để tối ưu hóa trình kết xuất đó là gì?

Câu trả lời:


41

Làm mờ bóng mờ chỉ là một kỹ thuật để "trì hoãn" hoạt động tạo bóng thực tế cho các giai đoạn sau, điều này có thể rất tuyệt để giảm số lượng đường chuyền cần thiết (ví dụ) để hiển thị 10 đèn cần 10 lần. Quan điểm của tôi là bất kể kỹ thuật kết xuất mà bạn đang sử dụng đều có những tối ưu hóa kết xuất nhất định có thể làm giảm số lượng đối tượng (đỉnh, chuẩn, v.v.) mà đường ống kết xuất của bạn cần xử lý.

Không có tiêu chuẩn thực tế nào để hiển thị tối ưu hóa, mà là một số kỹ thuật có thể được sử dụng thay thế cho nhau hoặc cùng nhau để đạt được các đặc tính hiệu suất nhất định. Sử dụng từng kỹ thuật phụ thuộc nhiều vào tính chất của cảnh được hiển thị.

Kết xuất hoãn lại cố gắng giải quyết vấn đề khi số lượng đèn tăng lên, trong kết xuất phía trước có thể làm cho số lượng đường chuyền phát nổ.

Những kỹ thuật này không trực tiếp tối ưu hóa phần bóng mờ bị trì hoãn, nhưng theo mô tả của bạn, phần bóng mờ bị trì hoãn KHÔNG phải là vấn đề của bạn. Vấn đề của bạn là bạn đang gửi toàn bộ cảnh để kết xuất đường ống. Vì vậy, công cụ của bạn phải xử lý (ví dụ như tất cả 100 triệu đỉnh) trong cảnh của bạn để có thể gửi kết quả đến bộ đệm g, trong khi hầu hết các đỉnh 100 triệu có thể bị loại bỏ một cách tầm thường và không được gửi đến đỉnh tiền xử lý và các mảnh vỡ đi qua.

Trong trường hợp trình kết xuất chuyển tiếp, đỉnh N sẽ được xử lý bởi giai đoạn đỉnh là tổng cộng vertex count*lights countvà bởi giai đoạn phân đoạn, tổng số fragments count*number Lightsbóng mờ bị trì hoãn làm giảm hiệu quả này xuống chỉ vertex countcho giai đoạn đỉnh và fragments countcho số lượng phân đoạn, trước khi giải quyết bóng thực tế. Nhưng N vẫn có thể là quá nhiều để xử lý, đặc biệt là khi hầu hết trong số chúng có thể bị loại bỏ một cách tầm thường.

Điều này làm cho việc loại bỏ hiệu quả hơn trong trường hợp kết xuất / chuyển tiếp nhiều lần. Nhưng hãy nhớ rằng hầu hết các động cơ sẽ sử dụng phương pháp kết xuất kép, bởi vì bóng mờ bị trì hoãn không thể giải quyết các vật thể trong suốt, điều này làm cho việc sử dụng những tối ưu hóa đó là điều bắt buộc, tôi không biết về bất kỳ động cơ thương mại nào không làm tất cả chúng.

Frustum Culling

Chỉ các Đối tượng được bao gồm đầy đủ hoặc một phần trong chế độ xem, bao giờ cần phải được gửi đến đường ống kết xuất. Đây là khái niệm cơ bản về loại bỏ bực bội, không may kiểm tra xem lưới có vào / ra khỏi chế độ xem có thể là một thao tác đắt tiền hay không, vì vậy, các nhà thiết kế động cơ sử dụng một thể tích giới hạn gần đúng như hộp giới hạn Trục (AABB) hoặc hình cầu giới hạn , mặc dù điều này có thể không chính xác như sử dụng lưới thực tế, sự khác biệt về độ chính xác không đáng để kiểm tra với lưới thực tế.

nhập mô tả hình ảnh ở đây

Ngay cả với các khối lượng giới hạn, bạn thực sự không cần phải kiểm tra từng cái, thay vào đó, bạn có thể xây dựng một hệ thống phân cấp âm lượng giới hạn để thực hiện loại bỏ trước đó, sử dụng điều này phụ thuộc nhiều vào độ phức tạp của cảnh.

Đây là một kỹ thuật tốt và đơn giản cho động cơ nhỏ hơn và gần như được sử dụng trong mọi động cơ tôi từng sử dụng. Tôi khuyên bạn nên sử dụng kiểm tra Khối lượng / Frustum "bình thường" không có phân cấp nếu công cụ của bạn không yêu cầu hiển thị các cảnh rất phức tạp.

Phân cấp khối lượng giới hạn

Quay mặt lại

Đây là điều bắt buộc, tại sao lại vẽ những khuôn mặt không thể nhìn thấy? API kết xuất cung cấp một giao diện để bật / tắt loại bỏ mặt sau. Trừ khi bạn có một lý do mạnh mẽ tại sao không bật nó lên, như một số ứng dụng CAD cần vẽ backfaces trong một số trường hợp nhất định, đây là điều cần phải làm.

Giết mổ

Sử dụng bộ đệm Z, bạn có thể giải quyết xác định mức độ hiển thị. Nhưng vấn đề là bộ đệm Z không phải lúc nào cũng tuyệt vời về hiệu năng, vì bộ đệm Z chỉ có thể được giải quyết ở các giai đoạn sau của đường ống, các đối tượng bị chặn nên được rasterized và có thể được ghi vào bộ đệm Z và Bộ đệm màu trước khi thất bại trong bài kiểm tra Z.

Loại bỏ loại trừ giải quyết điều này, bằng cách thực hiện một số thử nghiệm đầu tiên để loại bỏ các đối tượng bị loại bỏ trong phần kết xuất. Một triển khai thực tế của việc loại bỏ tắc nghẽn là sử dụng các truy vấn dựa trên điểm và kiểm tra xem các đối tượng nhất định có thể nhìn thấy được từ một quan điểm cụ thể hay không. Điều này cũng có thể được sử dụng để loại bỏ ánh sáng không đóng góp vào hình ảnh cuối cùng, điều này đặc biệt hữu ích trong trình kết xuất động cơ hoãn lại.

nhập mô tả hình ảnh ở đây

Một ví dụ thực tế tuyệt vời về kỹ thuật như vậy là trong GTA5, nơi các tòa nhà chọc trời được đặt ở vị trí trung tâm của thành phố, không chỉ là đồ trang trí, mà chúng còn hoạt động như một vật cản, ngăn chặn hiệu quả phần còn lại của thành phố và ngăn không cho nó tồn tại rasterized.

Chúa

Mức độ chi tiết

Mức độ chi tiết là kỹ thuật được sử dụng rộng rãi, ý tưởng là sử dụng một phiên bản lưới đơn giản hơn khi lưới ít đóng góp cho cảnh. Có hai cách thực hiện phổ biến; người ta chỉ đơn giản chuyển lưới bằng một cái đơn giản hơn khi nó không còn đóng góp nhiều nữa, lưới được chọn dựa trên một số yếu tố như khoảng cách và số pixel (diện tích trên màn hình) mà lưới đang chiếm. Phiên bản khác tự động nối lưới, điều này được sử dụng rộng rãi trong kết xuất địa hình.

nhập mô tả hình ảnh ở đây

Điều gì xảy ra nếu tất cả những thứ này không hoạt động?

Vâng, đó là một câu hỏi hay.

Điều đầu tiên bạn cần làm là Hồ sơ ứng dụng của bạn bằng cách sử dụng một trình lược tả đồ họa và xác định nơi tắc nghẽn. Hãy nhớ rằng nút cổ chai có thể thay đổi khi nội dung được hiển thị thay đổi. Nút cổ chai cũng có thể là một phần của mã chạy trên CPU, do đó bạn cũng cần phải đo nó.

Sau đó, bạn cần thực hiện một số tối ưu hóa cho nút cổ chai, hãy nhớ rằng không có câu trả lời đúng cho điều này, và sẽ khác với phần cứng khác.

Một số thủ thuật tối ưu hóa GPU phổ biến:

  • Tránh phân nhánh trong shader.
  • Hãy thử các cấu trúc đỉnh khác nhau, ví dụ {VNT}xen kẽ trong cùng một mảng hoặc {V},{N},{T}trong các mảng khác nhau.
  • Vẽ cảnh trước ra sau.
  • Tắt bộ đệm Z tại một số điểm, ví dụ nếu một hình ảnh không cần thử nghiệm Z.
  • Sử dụng kết cấu nén.

Một số thủ thuật tối ưu hóa CPU phổ biến:

  • Sử dụng các hàm nội tuyến cho các hàm nhỏ.
  • Sử dụng SIMD (Hướng dẫn nhiều dữ liệu) khi có thể.
  • Tránh bộ nhớ đệm không thân thiện nhảy.
  • Sử dụng VBO với lượng dữ liệu "đúng". (tùy thuộc vào phần cứng của bạn) nhưng thường thì các cuộc gọi rút thăm ít hơn sẽ tốt hơn.

Nhưng điều gì sẽ xảy ra nếu nút cổ chai của tôi ở trong bóng mờ bị trì hoãn?

Trong trường hợp này, vì bóng mờ bị trì hoãn quan tâm nhiều hơn đến đèn nên phần rõ ràng nhất là tối ưu hóa các tính toán bóng thực tế. một số điểm cần chú ý:

  • Kết xuất ánh sáng thực sự ảnh hưởng đến hình ảnh cuối cùng. Nói cách khác, loại bỏ ánh sáng không đóng góp. Điều này có thể được thực hiện một cách hiệu quả bằng cách sử dụng loại bỏ tắc mà tôi đã đề cập trước đó.
  • Liệu ánh sáng này cần đặc điểm hoặc một số thành phần khác? Có thể không.
  • Liệu ánh sáng này đổ bóng? Một số đèn không cần chiếu bóng.
  • Đóng góp ánh sáng này có thể được tính toán trước? Nếu nó không di chuyển có lẽ một số khía cạnh có thể được tính toán trước.

Xin lỗi, những điều này không liên quan gì đến bóng mờ bị trì hoãn, chúng thực sự là vấn đề hiệu suất chính xác mà kỹ thuật giảm thiểu hiệu quả và do đó tối ưu hóa ít hữu ích nhất để thực hiện, nên tập trung vào đèn chiếu sáng vì nếu chi phí chiếu sáng không phải là người làm thời gian chiếm ưu thế, bóng mờ bị trì hoãn có lẽ là lựa chọn sai lầm.
MickLH

@MickLH Thật không may, rõ ràng là bạn không đọc câu hỏi, vấn đề của anh ấy chủ yếu là anh ấy lặp đi lặp lại toàn bộ cảnh mọi lúc, và anh ấy đã không đề cập đến bất kỳ nút thắt nào liên quan đến bóng mờ. Lúc đầu tôi đã đề cập rằng bóng mờ được giải quyết sẽ giải quyết vấn đề nổ vượt qua khi có nhiều đèn / vật liệu. Nhưng sau đó tôi đã thêm rằng đó là những điều tối ưu hóa bắt buộc đối với bất kỳ động cơ nào, bất kể kỹ thuật tạo bóng tiến hay lùi. Liên quan đến việc đây là những vấn đề chính xác mà kỹ thuật mô tả mà tôi rất không đồng ý, tôi không thể giải quyết toàn bộ các điểm ở đây (sau)
khái niệm

Chẳng hạn, thật ngu ngốc khi chế tạo một công cụ hoãn lại mà không cần loại bỏ sự cố, vì vậy công cụ sẽ xử lý ví dụ (100 triệu đỉnh) chỉ để có thể gửi kết quả đến bộ đệm g. Việc tạo bóng khác nhau giải quyết một vấn đề khác, đó không phải là vấn đề của anh ta, vấn đề của anh ta là gửi tất cả các hình học cho đường ống.
concept3d

mặc dù tôi đồng ý về việc một số tối ưu hóa sẽ xảy ra đối với các tính toán chiếu sáng và nếu tính toán ánh sáng không phải là ưu thế thì việc trì hoãn là cách đi sai. nhưng một lần nữa đó không phải là vấn đề của anh ấy
concept3d

Tôi sẽ rút lại downvote của mình nếu bạn nói rõ rằng những tối ưu hóa này thực sự kém hiệu quả nhất đối với trình kết xuất bị trì hoãn, vì bạn vẫn chưa cho anh ấy / cô ấy biết rằng vấn đề về hiệu năng không liên quan đến bóng mờ.
MickLH

6

Vấn đề của bạn không liên quan đến bóng mờ bị trì hoãn , bạn cần triển khai các yếu tố cốt lõi cơ bản của trình kết xuất trước khi bạn cố gắng tăng tốc một số phần cụ thể.

Khi bạn đã hoàn thành với những gì Concept3d đã giải thích, nếu bạn thực sự thấy rằng bạn cần tối ưu hóa trình đổ bóng bị trì hoãn chính (trái ngược với toàn bộ đường rasterization), bạn có thể thực hiện Shading Trì hoãn Dựa trên Ngói.

Nếu bạn không bị giới hạn bởi số lượng đèn động, bạn nên xem xét lý do tại sao bạn lại sử dụng bóng mờ bị trì hoãn, nhưng nếu bạn thì bạn sẽ muốn thử tối ưu hóa giúp Battlefield 3 có thể. (Họ gợi ý cho nó trong slide 10 của PDF công khai của họ: http://dice.se/wp-content/uploads/GDC11_DX11inBF3_Public.pdf )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.