Cách hiệu quả nhất để tổ chức dữ liệu đỉnh trên GPU hiện đại


9

Giả sử tôi có một mô hình tạo thành đỉnh, mỗi position, normal, tangent, và texcoordcác thuộc tính, nơi tam giác được quy định bởi bộ ba chỉ số.

Nếu chúng ta chỉ tập trung vào các thuộc tính đỉnh, tôi nhận thức được hai chiến lược rộng lớn: cấu trúc của mảng và mảng cấu trúc. Tôi cũng đã nghe nói rằng các cấu trúc được ưa thích vì nó làm tăng vị trí bộ nhớ (và do đó là vị trí bộ đệm) của các thuộc tính cho một đỉnh đã cho.

Có thực sự là trường hợp này cải thiện hiệu suất? Cách chính mà tôi có thể nghĩ rằng điều này sẽ xảy ra là bởi các chỉ số đỉnh yêu cầu trình rasterizer thu thập dữ liệu đỉnh đã bị đuổi khỏi bộ đệm từ lâu. Nếu truy cập dữ liệu đỉnh là ngẫu nhiên như thế này, thì việc giữ tất cả các thuộc tính cho một đỉnh trên cùng một dòng bộ đệm chắc chắn sẽ khiến mọi việc nhanh hơn, nhưng đây có phải là vấn đề có thể được giảm thiểu bằng cách tối ưu hóa thứ tự đặc tả tam giác không?

Hơn nữa, tôi hiểu rằng các GPU hiện đại có thể tốt hơn trong việc giải nén các vectơ dài cùng loại, hơn các vectơ cấu trúc của nhiều loại. Sau đó, có thể bố trí cấu trúc của mảng có thể vượt trội hơn so với bố cục mảng cấu trúc của cùng một dữ liệu đỉnh, nếu thứ tự chỉ mục được tối ưu hóa?


4
Bạn không thể đơn giản thử nó và xem cái nào là nhanh nhất cho trường hợp của bạn?
dùng1118321

Tôi đã nghĩ cho các mắt lưới được lập chỉ mục rằng các cấu trúc mảng sẽ hiệu quả hơn vì trình tạo bóng đỉnh sẽ được cung cấp tất cả các thuộc tính đỉnh để việc chúng được nhóm lại với nhau trong bộ nhớ sẽ được lưu trữ thân thiện hơn.
PaulHK

Tùy thuộc vào các loại dữ liệu trong cấu trúc, vec4 và phao đóng gói độc đáo với nhau, các loại khác không tốt lắm
PaulHK

2
@ user1118321 Mặc dù các thử nghiệm đo điểm chuẩn cá nhân là một thông lệ đáng khen ngợi, nhưng chắc chắn có nhiều giá trị lâu dài hơn trong một cuộc thảo luận lý thuyết rộng hơn và có thể dẫn đến việc thiết lập các thực tiễn chung dựa trên cách thức hoạt động của phần cứng đỉnh.
Chris nói Phục hồi lại

Câu trả lời:


2

Xin lỗi, tôi sẽ thêm một bình luận vào chuỗi câu hỏi của bạn nhưng thấy tôi đã kết thúc quá nhiều. Kinh nghiệm phát triển của tôi là từ góc độ DX 11 nên một số điều này có thể không có trong OpenGL

Địa phương bộ nhớ của dữ liệu chắc chắn đóng một phần quan trọng. Nhưng có một vài mục khác thực hiện điều này, độ rộng của dữ liệu như bạn biết. Tôi đã có một vài GPU và đã có một hiệu suất rõ rệt dựa trên một số điểm dựa trên các điểm tới hạn nhất định. Đó là ví dụ, trên AMD r290 cũ của tôi nếu tôi nhớ lại, về cơ bản bạn có thể chuyển tối đa 4 float4 sang bộ đệm đỉnh mà không mất thêm chi phí nào trên 1, nhưng khi tôi đăng> 4 thì có sự sụt giảm có thể đo được (trong khung tỷ lệ). Đây hoàn toàn là hồi ức của tôi và giai thoại là tốt nhất. Nhưng nó cho rằng kiến ​​trúc GPU đang thay đổi mọi lúc, và những kỹ thuật thích hợp nào mang lại cho bạn lợi thế về hiệu suất ngày hôm nay có thể là nguyên nhân cho hiệu suất của bạn vào ngày mai. TÔI'

Như đã nói, bạn đã đặt câu hỏi về việc sắp xếp các đỉnh, và chắc chắn điều đó sẽ giúp ích rất nhiều. Hiệu suất đạt được là khi bạn kết hợp điều này với bộ đệm chỉ mục, sau đó cho phép phần cứng tối ưu hóa và lưu trữ các đỉnh đã được tính toán. Bạn chắc chắn có thể nhận được nhiều lợi nhuận hơn nữa từ các dải Tam giác, vv được sắp xếp cụ thể theo suy nghĩ của bạn. Hầu hết các kết xuất mô hình tôi làm là các mô hình được tối ưu hóa dựa trên indice / vertex với sự ổn định, tôi sử dụng một lượng nhỏ tra cứu cho các hiệu ứng chuyển động theo chu kỳ (ví dụ như nhánh cây), trong những trường hợp này, toàn bộ nhánh của cây đang tìm kiếm cùng một giá trị. Vì vậy, bộ nhớ đệm có thể được tận dụng ở đây cũng.

Tất cả những gì tôi có thể nói tóm tắt từ bản thân mình là:

  • Cố gắng không lật đổ tối ưu hóa khi bắt đầu, trong khi bạn vẫn đang phát triển trò chơi / ứng dụng của mình cố gắng không tối ưu hóa sớm. Nếu bạn cần quay lại và thêm các khả năng mới, bạn có thể mất tất cả nỗ lực. Bạn có thói quen của tôi có thể> <, thích cố gắng để có được hiệu suất và kỹ thuật tốt nhất
  • Kiến trúc GPU rất đa dạng và điểm mạnh của người này có thể phản ánh điểm yếu ở người khác. AMD và Nvidia nổi tiếng vì nhận được các nhà phát triển để tối ưu hóa trò chơi theo kiến ​​trúc của họ, vì một lý do, mỗi cái đều có ưu điểm / nhược điểm. Đi đường giữa phát triển có thể là nơi tốt nhất, không sử dụng bất kỳ tính năng dựa trên nhà cung cấp phần cứng nào (ý kiến ​​ở đây). (thêm vào đó, một số định dạng đóng gói chỉ tồn tại trong AMD).

Đây chỉ là một vài suy nghĩ và kinh nghiệm tôi đã có. Có rất nhiều cuốn sách mà bạn nên nắm trong tay những chủ đề này. Tôi đã không thấy nhiều người quy định những gì bạn đề xuất, nhưng điều đó không có nghĩa là nó sai. Chúc may mắn.


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.