Bộ đệm Vertex - xen kẽ hay tách biệt? [đóng cửa]


7

Xen kẽ - tất cả dữ liệu đỉnh (vị trí, bình thường, texcoord ...) được giữ trong 1 bộ đệm đỉnh, riêng biệt - mỗi thuộc tính đỉnh được giữ trong một bộ đệm đỉnh riêng biệt (1 cho vị trí, 1 cho quy tắc ...).

Tôi biết câu hỏi này đã xuất hiện nhiều lần và tôi cũng biết không có câu trả lời đúng 1 (đáng buồn thay). Nhưng tôi muốn thử liệt kê những ưu điểm / nhược điểm chính của cả hai. Hoặc có thể bạn có một số quy tắc chung về thời điểm sử dụng.

  1. Ưu điểm của xen kẽ:

    • nhanh hơn? (tất cả dữ liệu cho 1 đỉnh được tải cùng một lúc? sth về bộ đệm hoạt động tốt hơn)?
    • các lệnh gọi API ít hơn (để tạo và thiết lập bộ đệm nhưng đó có thể là một sự khác biệt rất nhỏ)
  2. Ưu điểm riêng biệt:

    • khi các shader khác nhau cần các thuộc tính đỉnh khác nhau (ví dụ: một shader chỉ cần vị trí và một vị trí cần khác, bình thường và texcoord), có thể chỉ cung cấp cho mỗi shader dữ liệu mà nó cần và không có sự trùng lặp dữ liệu
    • khi chỉ cập nhật vị trí của các đỉnh, không cần thiết phải gửi lại dữ liệu thuộc tính khác (ví dụ: chuẩn và texcoords)

Nếu bạn thấy bất kỳ sự khác biệt khác xin vui lòng viết. Nhìn từ trên, nó trông giống như một cuộc đấu tranh giữa tối ưu hóa hiệu năng và bộ nhớ. Nhưng có lẽ tôi đã sai? Có lẽ một là tốt hơn / tồi tệ hơn trong hầu hết các trường hợp?

Chỉnh sửa: Thực sự là một mối quan tâm nữa - với các bộ đệm xen kẽ, cuối cùng tôi có thể gửi dữ liệu không cần thiết đến GPU và băng thông dữ liệu là một nút cổ chai lớn trong các thẻ ngày nay. Tôi có nên lo lắng về điều đó?


Tôi đã đọc ngay bây giờ. Các dòng bộ đệm là tối thiểu 32 byte, xen kẽ. Điều này áp dụng cho cả đọc và tải lên.
MickLH

Nếu bạn chắc chắn như vậy thì bạn phải có một số lập luận rất mạnh mẽ cho cách tiếp cận đó - bạn có thể chia sẻ với chúng tôi không?
NPS

Cập nhật. chúc ngủ ngon
MickLH

có thể trùng lặp các định dạng
xen kẽ

1
@SeanMiddleditch Tôi tin rằng chủ đề bạn liên kết đến (cả câu hỏi và câu trả lời) đưa ra một vấn đề khác với tôi. Tôi đang hỏi về sự khác biệt giữa các cách tiếp cận xen kẽ và riêng biệt, Steve hỏi liệu anh ta có thể lưu một số bộ nhớ bằng cách không sao chép dữ liệu bình thường cho mỗi đỉnh.
NPS

Câu trả lời:


8

Gần đây tôi đã triển khai cả hai phiên bản trong OpenGL (4.3) và sử dụng cảnh Sponza (Crytek) làm cảnh kết xuất thử nghiệm, tôi có các shader chỉ sử dụng một tập hợp con hoặc tập hợp đầy đủ của tất cả các thuộc tính đỉnh được xác định.

Có một sự khác biệt trong thiết lập của bạn: Trong trường hợp không xen kẽ, các thuộc tính cũng nằm trong cùng một bộ đệm đỉnh. Thật dễ dàng để làm điều này với OpenGL, bạn chỉ có thể liên kết các byte bù với một thuộc tính nhất định với glVertexAttribPulum (...) với tham số cuối cùng. Một tùy chọn tương đương có thể tồn tại cho DirectX.

Cụ thể, trong khi hiển thị bản đồ bóng, chỉ cần các vị trí đỉnh (trong trường hợp của tôi) đã tăng từ ~ 210 đến ~ 220 FPS khi sử dụng bộ đệm không xen kẽ, chênh lệch khoảng 0,2ms. Nói cách khác, bạn thậm chí không thể tăng từ 60 FPS lên 61 FPS với tốc độ đó.

Khi hiển thị cảnh từ phối cảnh của bóng tối, nhưng sử dụng tất cả các thuộc tính (trong trường hợp của tôi, vượt qua hình học bóng mờ bị trì hoãn), hiệu suất đã không thay đổi ở cả hai phiên bản.

Tôi chỉ có thể đoán, nhưng tôi nghĩ lý do khiến việc hiển thị bản đồ bóng được cải thiện là do GPU có thể (như CPU) không chỉ rút các byte, từ hoặc mật khẩu ra khỏi bộ nhớ với một lần truy cập bộ nhớ, mà thay vào đó là kéo nhiều byte hơn (trên hầu hết các CPU hiện đại đây sẽ là 64 byte cho mỗi lần truy cập) và lưu trữ nó ở đâu đó. Khi dữ liệu được xen kẽ, GPU có thể kéo một bộ vị trí / bình thường / texcoord / bất cứ thứ gì trên mỗi lần truy cập bộ nhớ, trong đó tất cả trừ vị trí sẽ bị lãng phí băng thông bộ nhớ nếu bạn chỉ sử dụng vị trí.

Một cảnh báo: Tôi không bị ràng buộc băng thông bộ nhớ trong trường hợp thử nghiệm của mình, vì vậy nếu thông lượng bộ nhớ là nút cổ chai của bạn, các phép đo có thể khác nhau.

Nhìn chung, tôi khuyên bạn nên để nó theo cách bạn có ngay bây giờ và thay đổi nó sau khi bạn nhận thấy rằng một số tối ưu hóa là cần thiết. Việc thay đổi không mất nhiều thời gian, bạn chỉ cần thay đổi cách truyền dữ liệu vào bộ nhớ GPU và thay đổi cách các thuộc tính được ràng buộc bằng API đồ họa của bạn.


+1, đặc biệt là cho một số dữ liệu cứng. Tôi hy vọng rằng một lý do có thể khiến bạn không thấy sự cải thiện hoàn hảo với trường hợp không xen kẽ là nó cũng đòi hỏi những thay đổi trạng thái bổ sung, mà trường hợp xen kẽ có thể tránh được. Tất cả là một hành động cân bằng ...
Maximus Minimus

+1 để xem bản đồ bóng - đó là một thử nghiệm tốt cho câu hỏi này vì bóng thường bị giới hạn bởi đỉnh và chỉ cần một hoặc hai trong số nhiều thuộc tính đỉnh. Các lợi ích sẽ thay đổi tùy theo cảnh và phần cứng - hình học dày đặc hơn sẽ mang lại nhiều tốc độ hơn và các nền tảng có ít bộ nhớ hơn cũng sẽ làm như vậy. Tối ưu hóa này khá hữu ích trên PS3 - có thể không quá nhiều trên các PC cao cấp hiện đại hoặc các máy chơi game mới, nhưng có lẽ vẫn hữu dụng trên các nền tảng di động.
Nathan Reed

0

xen kẽ : nếu dễ hiểu hơn và quản lý bộ nhớ khôn ngoan và mã khôn ngoan. Thay vì có 4 bộ đệm, bạn chỉ có một bộ đệm.

riêng biệt : không có lợi thế thực tế trong việc chia sẻ tài nguyên, việc quản lý nội dung 3d rất khó khăn và bằng cách chia sẻ các luồng riêng biệt sẽ chỉ tạo ra một cơn ác mộng. Bạn có thể có được một số bộ nhớ bằng cách làm điều đó nhưng nó không đáng.

về hiệu suất có thể có sự khác biệt, ít nhất là trên một số GPU Android tôi biết rằng bạn sẽ có kết quả khác nhau.


Chỉ khó khăn cho một con người
MickLH

Bạn đã nói "có thể đạt được một số bộ nhớ" - khi tôi có các mô hình rất lớn (idk, đỉnh 100k? More?) Và nói 3 loại shader khác nhau biểu hiện mô hình đó không phải là nhiều bộ nhớ?
NPS

1
@NPS API cung cấp cách giải quyết mà bạn có thể có các đỉnh xen kẽ với các vị trí / quy tắc, v.v. và sử dụng trong các shader đúng như những gì bạn muốn.
Raxvan

@Raxvan Ok thì cái nào tốt hơn - 2 bộ đệm đỉnh (1 với [position, normal]cái kia và cái kia [position, normal, texcoord]) và sử dụng mỗi cái cho shader tương ứng của nó hoặc chỉ có 1 bộ đệm đỉnh (cái sau) và sử dụng nó cho cả hai shader?
NPS

@NPS cái cuối cùng cho cả hai, nếu shader không muốn các thông số, ví dụ bạn có thể sử dụng bộ đệm đó mà không gặp vấn đề gì, sẽ có một bước trong thiết lập nơi bạn chỉ định các luồng và ở đó bạn có thể bỏ qua các quy tắc.
Raxvan
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.