Kết cấu bản đồ so với kết cấu mảng: chúng được xử lý bởi CPU và GPU khác nhau như thế nào và điều đó ảnh hưởng đến hiệu suất như thế nào?


10

Unity 5.4 (hiện đang ở giai đoạn thử nghiệm), sẽ mang đến một tính năng được chờ đợi (kể từ năm 2013), đó là kết cấu mảng - tương tự như ArrayTexture của OpenGL . Tuy nhiên, sau khi đọc một số thông tin về mảng - kết cấu và kết cấu, tôi vẫn không thể hiểu được sự khác biệt về kỹ thuật đối với việc sử dụng CPU và GPU.

Vì vậy, để cụ thể hơn, tôi muốn yêu cầu một lời giải thích về sự khác biệt chính giữa cách thức bản đồ kết cấu và mảng kết cấu được xử lý bởi CPU và GPU và quan trọng nhất là sự khác biệt đó có thể ảnh hưởng đến hiệu năng và xử lý bộ nhớ (ví dụ làm thế nào mảng kết cấu có thể có hiệu suất cao hơn so với kết cấu, vv).

Nếu các chi tiết kỹ thuật về việc triển khai của Unity bị thiếu do tính đóng kín đáng tiếc của nó, tôi sẽ rất vui với câu trả lời liên quan đến OpenGL.s ArrayTexture.


Tôi không ngạc nhiên khi bạn không tìm thấy so sánh kỹ thuật, vì cả hai đều phụ thuộc vào việc triển khai (nhiều hơn cho mảng).
wonderra 17/05/2016

Bạn sẽ có một thời gian khó khăn để có được thông tin về cách thức bên trong của chức năng công cụ Unity, vì nó là một nguồn đóng, hộp đen. Điều duy nhất bạn có thể làm là lập hồ sơ cho từng trường hợp và tự mình so sánh việc sử dụng cpu và gpu. Để hiểu cách thức hoạt động của nó, sẽ yêu cầu một kỹ sư Unity bước vào hoặc mã nguồn của họ phải được mở hoặc rò rỉ.
jgallant

@Jon Đủ, nhưng thực sự tôi quan tâm nhiều hơn đến câu trả lời không theo động cơ. Nếu nó thay đổi nhiều như vậy, tôi có thể cập nhật câu hỏi để nói về, ví dụ, ArrayGLure của OpenGL: opengl.org/wiki/Array_Texture
ASteer

Câu trả lời:


11

Như đã lưu ý trong các ý kiến ​​trên, hiệu suất sẽ phụ thuộc vào việc triển khai, phần cứng cụ thể của bạn và những gì bạn đang cố gắng thực hiện với kết cấu, vì vậy câu trả lời đáng tin cậy duy nhất là ghi lại từng phương án.

Có một vài sự khác biệt về cách bạn sử dụng từng tùy chọn, điều này sẽ được áp dụng nhất quán:

Một sự khác biệt lớn là, đối với kết cấu mảng, mỗi kết cấu được xử lý riêng cho các mục đích như gói tọa độ kết cấu hoặc mipmapping.

Điều này tránh các vấn đề phổ biến với các giai đoạn kết cấu, trong đó chúng ta cần thêm phần đệm giữa các mẫu kết cấu liền kề để giữ cho các mẫu ở các cạnh của chúng không bị chảy máu với nhau, đặc biệt là ở mức độ mip sâu hơn.

Điều này cũng có nghĩa là nếu bạn muốn kết cấu của bạn xếp, bạn có thể sử dụng phần cứng lấy mẫu kết cấu để làm điều đó giống như với kết cấu vanilla. Với atlase, chúng ta thường phải thực hiện phép toán ốp lát trong shader mảnh của chúng ta, vì bộ lấy mẫu chỉ bọc / gương / kẹp / viền tọa độ kết cấu trên toàn bộ bản đồ, không phải các ô riêng lẻ bên trong nó.

Hạn chế chính với kết cấu mảng là chúng yêu cầu tất cả các kết cấu cấu thành của chúng phải có cùng độ phân giải và số lượng mức mip. Nếu bạn đang cố gắng kết hợp nhiều kết cấu với các nhu cầu độ phân giải rất khác nhau (giả sử, lưu trữ các ô địa hình có LoD rơi ra khoảng cách trong một kết cấu ảo ) thì bạn có thể muốn có sự linh hoạt của tập bản đồ.


Cảm ơn, đó là chính xác những gì tôi đã sau. Ý tôi là, không phải là một câu trả lời về chính xác mà nhanh hơn bộ nhớ ít hơn - vì tất nhiên những điều này phụ thuộc vào việc thực hiện. Tuy nhiên, tôi chắc chắn rằng một số gợi ý về chức năng của từng trường hợp có thể hữu ích để hiểu các tình huống phù hợp nhất và tồi tệ nhất thông thường của họ. Câu trả lời của bạn đã thực sự giúp tôi về điều đó.
ASteer

Một nhược điểm khác của kết cấu mảng: chúng bị giới hạn bởi GL_MAX_ARRAY_TEXTURE_LAYERS. Trên GPU bán hiện đại của tôi, đây là năm 2048, vì vậy nếu bạn muốn hàng tấn họa tiết nhỏ, giới hạn này có thể quá thấp.
JWD
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.